Upload
others
View
10
Download
0
Embed Size (px)
Citation preview
WebStore #mavenJAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc
Óbudai Egyetem, Java Enterprise EditionMűszaki Informatika szakLabor 8
Bedők Dávid2018-03-03v1.0
Bedők Dávid (UNI-OBUDA) WebStore () 2018-03-03 v1.0 1 / 43
SOAP webszolgáltatások
. 1998, 2000 (v1.1), 2003 (v1.2 W3C ajánlással)
. Simple Object Access Protocol (SOAP), de 1.2 után "nemhasználjuk kibontva" mert nem túl találó a név
. XML SOAP Request üzenetre XML SOAP Response üzenet érkezik(XSD írja le a típus információkat!)
. Web Services Description Language (WSDL) írja le a kommunikációlehetőségeit és szabályait
. Általában HTTP(S)-n keresztül küldjük (hasonlóan a RESTfulwebszolgáltatásokhoz), ám ez csupán egy gyakori opció jelen esetben
. Rendkívül jól bővíthető, nagyszerű és kiforrott (és jelenleg is bővülő)szabványok vezérlik
. Titkosítás és digitális aláírás(ok) támogatása - Web ServicesSecurity (WS-Security, WSS)
. Universal Description Discovery and Integration (UDDI),webszolgáltatások regisztrálása szolgáltatások keresőkbe
Bedők Dávid (UNI-OBUDA) WebStore (soap-ws.tex) 2018-03-03 v1.0 2 / 43
Top-Down vs. Bottom-Up megközelítés
. Top-down megközelítés : WSDL-t készítünk, majd ebből gépi útonlegeneráljuk a szükséges Java osztályokat (stub-okat az XSD alapján,és service-t a WSDL többi része alapján)
. Bottom-up megközelítés : Java kódot készítünk (stub-ok, service,számos annotáció), és ebből generáltatjuk le a WSDL-t
Kliens vonatkozásábanKliens készítéshez csak és kizárólag a WSDL-re van szükség (ettől lesz atörténet programozási nyelvek között szabadon átjárható, mégis közel olyantípusos (és egyértelmű, gép és ember számára is), mint pl. a Java).
Bedők Dávid (UNI-OBUDA) WebStore (topdown-vs-bottomup.tex) 2018-03-03 v1.0 3 / 43
KonfigurációSOAP üzenet formátuma vonatkozásában (négy kombináció)
. Encoding Style/Communication Style (megnevezett tulajdonság a WSDL-ben)
• Document/Message-Oriented : szabadon formázható XML tartalom(egyedül az XML formázás szabályainak kell megfelelni)
• RPC : kötöttebb (sokszor bővebb, a művelet nevének és argumentumai-nak muszáj jelen lennie), ám gépi úton könnyebben automatizálható
. Encoding Models (megnevezett tulajdonság a WSDL-ben)• Literal : a tartalomnak illeszkednie kell a WSDL-ben leírt, felhasználó ál-
tal definiált XSD típus információkra (XSD validáció). További előny hogyXSLT segítségével az üzenet válasza könnyen és egyértelműen átalakítha-tó mássá (pl. XHTML dokumentummá egy weboldal/webalkalmazás szá-mára)
• Encoded : csak és kizárólag előre definiált XSD típusok használhatóak(nehézkesebb validáció)
Document style esetén lehetőség van a SOAP Response validálására, mígRPC esetén ez nagyon körülményes, bizonytalan. Az általunk választottkonfiguráció a Document/literal lesz.
Bedők Dávid (UNI-OBUDA) WebStore (configuration-message.tex) 2018-03-03 v1.0 4 / 43
KonfigurációParameter Stlye
. Parameter Style (a hivatkozások lesznek máshogy szervezve a WSDL-ben)
• BARE : nem csomagol semmit a SOAP üzenetekbe, ha olvashatóeredményt szeretnénk, mi magunknak kell csomagoló osztályokatkészítenünk (mind paraméterként, mind visszatérési értékként). AWSDL szintjén az operation, message és element részek neveikülönbözőek lesznek/lehetnek ez esetben.
• WRAPPED : a kérés és a válasz paramétereit becsomagolja a mű-velet köré (átláthatóbb, ám néhol hosszabb SOAP üzeneteket ered-ményezhet). A WSDL szintjén az operation, message és elementrészek nevei azonosak lesznek ez esetben.
Az általunk választott konfiguráció a WRAPPED Parameter Style lesz.
Bedők Dávid (UNI-OBUDA) WebStore (configuration-parameter.tex) 2018-03-03 v1.0 5 / 43
WSDL felépítéseA megvalósítandó feladat példája alapján� �1 2 3 [..]
4 5 [..]6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 � �
Bedők Dávid (UNI-OBUDA) WebStore (wsdl-overview.tex) 2018-03-03 v1.0 6 / 43
A WSDL egyes részei egymás elemeire vagyegészére hivatkoznak. A service hivatko-zik a binding-ra, a binding a portType-ra és az azon belül definiált operation-ökre, a portType operation-jei hivatkoz-nak a message-ekre, a message-ek pediga WSDL-ben megtalálható XSD schema ele-mekre (types rész).
SOAP üzenetek - Request és Response� �1 2 3 4 5 6 � �
SOAP Request
A http://schemas.xmlsoap.org/soap/envelope/ névtér határozza meg az alap elemeket ésattribútumokat (pl. Envelope, Header, Body, stb), míg a http://www.qwaevisz.hu/WebStorenévtér a saját alkalmazásunk névtere, amit majd definiálni fogunk (pl. ListAllProducts,ListAllProductsResponse).� �1 2 3 4 5 6 7 8 9
10 11 12 � �
SOAP ResponseBedők Dávid (UNI-OBUDA) WebStore (soap-messages.tex) 2018-03-03 v1.0 7 / 43
http://schemas.xmlsoap.org/soap/envelope/http://www.qwaevisz.hu/WebStore
WebStoreSOAP webszolgáltatások
Feladat : Készítsünk egy webáruház alkalmazást, melyben különféle márkájúTV készülékeket lehessen vásárolni. Az alkalmazás a raktáron lévő termékeketmemóriában tárolja, a vásárlók hitelesítésével ne foglalkozzunk.Készítsünk a raktárkészlet lekérdezésére szolgáló, illetve a webkosár ke-zelésére alkalmas SOAP webszolgáltatást !A webkosár az adott user-session idejére tartalmazzon termékeket (márka,megnevezés, egységár). Ha ugyanabból a termékből többet vásárol a felhasz-náló, csak a darabszámot növeljük a kosárban!
[gradle|maven]\jboss\webstore
Bedők Dávid (UNI-OBUDA) WebStore (webstore.tex) 2018-03-03 v1.0 8 / 43
WebStoreKövetelmények
. A vásárló a kosárnak adhasson egy azonosítót/nevet, melyet beállításután vissza is kérhet (csupán demonstrációs cél). Ha névtelen kosárnevét kérjük le, a rendszer adjon SOAP Fault hibaüzenetet a felhasz-nálónak.
. A webkosár tartalmát, állapotát Stateful Session Bean-ben tároljuk.
. Kliens alkalmazásként SOAP-UI programot illetve saját készítésű Javakliens alkalmazást is készítsünk.
Bedők Dávid (UNI-OBUDA) WebStore (requirements.tex) 2018-03-03 v1.0 9 / 43
Project felépítéseModule-ok elhelyezkedése
Bedők Dávid (UNI-OBUDA) WebStore (webstore-overview.tex) 2018-03-03 v1.0 10 / 43
Persistence layerws-persistence project
� �1 @Local2 public interface StoreHolder {3 void create(Product product);4 Product read(String name);5 List readAll(String nameTerm);6 List readAll(Brand brand);7 List readAll ();8 void delete(String name);9 }� �
StoreHolder.java� �1 @Local2 public interface PersistenceService {3 void create(Product product) throws PersistenceException;4 Product read(String name) throws PersistenceException;5 List readAll(String nameTerm) throws PersistenceException;6 List readAll(Brand brand) throws PersistenceException;7 List readAll () throws PersistenceException;8 void delete(String name) throws PersistenceException;9 }� �
PersistenceService.java
Bedők Dávid (UNI-OBUDA) WebStore (persistence-services.tex) 2018-03-03 v1.0 11 / 43
A StoreHolder Singleton Ses-sion Bean tárolja (és iniciali-zálja) a saját domain típuso-kat (Brand és Product), míga PersistenceService StatelessSession Bean ehhez biztosít hoz-záférést az EJB service réteg szol-gáltatásai számára.
Adatmodellws-persistence és ws-ejbservice project
. Persistence layer• Brand : PHILIPS, SONY, PANASONIC• Product : brand (Brand), name (String), price (int)
. EJB Service layer• BrandStub : PHILIPS, SONY, PANASONIC• ProductStub : brand (BrandStub), name (String), price (int)• BasketItem : product (ProductStub), quantity (int)• Basket : identifier (String), items (List)• ServiceError : code (int), message (String)
XML annotációkA stub-ok XML Bind annotációkkal vannak gazdagítva, hiszen ezek részt vesznek aSOAP kommunikációban, a SOAP XML üzenetek szerver részét fogják képezni!@XmlAccessorType(XmlAccessType.FIELD) : Az annotációk a mezőkön vannakdefiniálva.@XmlAccessorType(XmlAccessType.PROPERTY) : Az annotációk a getter metódusokonvannak definiálva.
Bedők Dávid (UNI-OBUDA) WebStore (domain.tex) 2018-03-03 v1.0 12 / 43
A Basket osztály tartalmazüzleti metódusokat is a webko-sár kezeléséhez (increment(),decrement(), getSize(),getTotal()).
XML Binding� �
1 @XmlAttribute(name = "productName")2 private String name;� �A FIELD alapú elérésre példa a termék neve, mely esetén a SOAP-banszereplő üzleti név eltér a forráskód szabályai szerint megadottól. Az@XmlAttribute annotáció értelemszerűen attribútum lesz, itt XML-ben acamelCase írásmód az elterjedt, illetve ez az annotáció nem alkalmazhatóösszetett típusokra.� �1 @XmlAttribute(name = "total")2 public int getTotalPrice () {..}� �A kosár teljes értékét egy számított mezővel tudjuk megjeleníteni az XMLüzenetekben, ez esetben kizárólag a PROPERTY alapú elérés használható.� �1 @XmlElement(name = "Items")2 public List getItems () {..}� �Listák, tömbök, halmazok esetén a megadott elem név (@XmlElementannotáció) a gyermek elemek csoportosító elem neve lesz. Element-ekesetén az elterjedt írásmód XML-ben a CamelCase, mely eltér a Javaelnevezés szabályaitól.
Bedők Dávid (UNI-OBUDA) WebStore (stub-xml-bind.tex) 2018-03-03 v1.0 13 / 43
EJB Service - Hibakezelésws-ejbservice project
A ServiceError tartalmából fogunk későbbiekben SOAP Fault customhibaüzenetet (XML) gyártani. Természetesen most is az EJB réteg kivé-telt fog dobni hiba esetén (ServiceException), melybe elcsomagolunk egyhibakódot (WebStoreError enum: IDENTIFIER, PERSISTENCE, PRODUCT,BASKET).
Rétegek közötti függőségA nyilvános interface-ek felé (SOAP) az EJB szolgáltatások rétege a már meg-ismert minták alapján a Product és Brand példányokból stub-okat készít aProductConverter Stateless Session Bean segítségével. Vegyük észre, hogy at-tól függetlenül, hogy az adatokat memóriában tároljuk, az EJB service felépítéseazonos a korábban megismerttel. Bár jelen esetben overkill -nek tűnhet a konverzióés akár egészében a teljes persistence réteg, e megoldás segítségével később úgyvezethetjük be pl. a RDBMS-ben való tárolást, hogy a teljes szolgáltatás rétegérintetlen maradhat (nem függ a tárolási réteg a logikai rétegtől).
Bedők Dávid (UNI-OBUDA) WebStore (ejbservice-error-handling.tex) 2018-03-03 v1.0 14 / 43
EJB Service - Szolgáltatásokws-ejbservice project� �1 @Local2 public interface WebBasketService {3 void setIdentifier(String identifier) throws ServiceException;4 String getIdentifier () throws ServiceException;5 int getBasketSize () throws ServiceException;6 void addItem(String productName) throws ServiceException;7 void removeItem(String productName) throws ServiceException;8 Basket getContent () throws ServiceException;9 }� �
WebBasketService.java� �1 @Local2 public interface StoreService {3 void add(ProductStub product) throws ServiceException;4 ProductStub get(String name) throws ServiceException;5 List list(String nameTerm) throws ServiceException;6 List list(BrandStub brand) throws ServiceException;7 List getAll () throws ServiceException;8 void remove(String name) throws ServiceException;9 }� �
StoreService.javaBedők Dávid (UNI-OBUDA) WebStore (ejbservice-services.tex) 2018-03-03 v1.0 15 / 43
Stateful Session Bean
Stateless Session Bean
Stateful Session Bean
. Az implementációt tartalmazó osztály rendelkezik a @Statefulannotációval.
. Az osztály tartalmazhat instance field-eket, melyek állapotasession-önként értelmezett. Ha ugyanaz a session ismét meghívja aSFSB egy másik metódusát, az EJB container olyan állapotú példánytad vissza kiszolgálásra, melyben megtalálhatóak a session állapotai(mező értékei).
. @PostConstruct annotációval ellátott metódus akkor fog lefutni,amikor új session hív meg üzleti metódust a bean-en belül.
. @Remove annotációval ellátott metódus akkor fog lefutni, amikor asession már invalid, nem elérhető (pl. timeout miatt).
ÁllapotkezelésA Stateful Session Bean mellett a Singleton Session Bean is tárolhat állapotot, azéletciklusa utóbbinak mégis a Stateless Session Bean-hez hasonló, mivel itt nincs szükségún. aktiválásra és passziválásra.
Bedők Dávid (UNI-OBUDA) WebStore (stateful-session-bean.tex) 2018-03-03 v1.0 16 / 43
Session BeanÁllapotok és életciklusok
. Stateless és Singleton Session Bean-ek, illetve Message-DrivenBean-ek esetén
• Does not exist állapot• Ready állapot (üzleti metódus hívásra kész proxy -n keresztül)
. Stateful Session Bean-ek esetén• Does not exist állapot• Ready állapot (aktív, üzleti metódus hívásra kész)• Passive állapot
◦ Memóriából a "secondary storage"-re írja a container azállapotát, mert még szükség lehet rá, de most épp nemhasználja a user
◦ @PrePassivate és @PostActivate metódusok készíthetőek
@PostConstruct és @PreDestroy metódus mindegyik típusú Session Bean-hezkészíthető.
Bedők Dávid (UNI-OBUDA) WebStore (session-beans-lifecycle.tex) 2018-03-03 v1.0 17 / 43
WebStoreService - Keretws-webservice project
WSDL : http://localhost:8080/webstore/WebStoreService?wsdl� �1 package hu.qwaevisz.webstore.webservice;2 [..]3 @WebService(name = "WebStore", serviceName = "WebStoreService", targetNamespace =
"http :// www.qwaevisz.hu/WebStore")4 @SOAPBinding(style = Style.DOCUMENT , use = Use.LITERAL , parameterStyle =
ParameterStyle.WRAPPED)5 public class WebStoreService {6 [..]7 @EJB8 private StoreService storeService;9
10 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/getProduct", operationName ="GetProduct")
11 @WebResult(name = "Product")12 public ProductStub getProduct(@WebParam(name = "Name") String name) throws
WebStoreServiceException {13 try {14 return this.storeService.get(name);15 } catch (ServiceException e) {16 throw new WebStoreServiceException(e.getMessage (), e.getError ());17 }18 }19 [..]20 }� �
WebStoreService.javaBedők Dávid (UNI-OBUDA) WebStore (webstoreservice-frame.tex) 2018-03-03 v1.0 18 / 43
Névtér beállítások a @WebService annotáció,míg konfigurációs elemek a @SOAPBinding an-notáció segítségével valósíthatóak meg.
http://localhost:8080/webstore/WebStoreService?wsdl
WebStoreService - GetProductws-webservice project
A @WebMethod annotációval ellátott metódus lesz egy művelet/üzenet pár a web-szolgáltatásban. Az annotáció attribútumaival tudjuk részletesen konfigurálni, hogymilyen néven jelenik meg majd mindez a WSDL-ben (mindezekre kihatnak a kon-figurációs beállítások is). Ha az operation neve GetProduct (és ez element-kéntmegjelenik az SOAP Request-ben), akkor erre a válasz a SOAP Response-banGetProductResponse lesz.� �1 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/getProduct", operationName =
"GetProduct")2 @WebResult(name = "Product")3 public ProductStub getProduct(@WebParam(name = "Name") String name) throws
WebStoreServiceException {4 [..]5 }� �A @WebResult annotáció a visszatérési érték wrappere lesz. A ProductStub pél-dány egy Product elembe lesz visszaküldve a SOAP Response-ban. Ha nem defi-niáljuk a @WebResult-ot, akkor egy return elemben jelenik meg a ProductStubXML szerializációja (az @XmlRootElement annotáció jelen konfiguráció esetén nemszámít). A @WebParam annotáció a kérés (request) XML elem nevét tudja definiálni(egy Name elementben lehet megadni a keresett termék pontos megnevezését).
Bedők Dávid (UNI-OBUDA) WebStore (webstoreservice-getproduct.tex) 2018-03-03 v1.0 19 / 43
SOAP üzenetek - GetProduct� �1 2 3 4 5 SD85 4K HDR6 7 8 � �
SOAP Request� �1 2 3 4 5 6 7 � �
SOAP Response
Hibaesetek kezeléseHa a WebMethod kivételt dob, akkor ebből SOAP Fault válasz készül.Ellenkező esetben a visszatérési érték példánya XML szerializáláson esikkeresztül.Bedők Dávid (UNI-OBUDA) WebStore (soap-messages-getproduct.tex) 2018-03-03 v1.0 20 / 43
A brand, productName és price attribútum nevek a ProductStubXML Bind annotációin keresztül konfigurálhatóak.
WSDL - Termék lekérdezéseTípus információk� �1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 [..]29 � �
Bedők Dávid (UNI-OBUDA) WebStore (wsdl-getproduct-types.tex) 2018-03-03 v1.0 21 / 43
A típus információkhoz egyrészt a http://www.w3.org/2001/XMLSchema namespacealatti értékeket (pl. int, string), másrésztaz alkalmazás saját névtere (http://www.qwaevisz.hu/WebStore) által bevezetett tí-pusok használhatóak.
http://www.w3.org/2001/XMLSchemahttp://www.w3.org/2001/XMLSchemahttp://www.qwaevisz.hu/WebStorehttp://www.qwaevisz.hu/WebStore
WSDL - Termék lekérdezéseÜzenetek definiálása� �1 2 3 4 5 6 7 8 9
10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 [..]27 28 � �Bedők Dávid (UNI-OBUDA) WebStore (wsdl-getproduct-messages.tex) 2018-03-03 v1.0 22 / 43
Hivatkoznak a típus definíciókra.
A hibakezeléshez kapcsolódó típu-sokat és üzeneteket nem tartal-mazza a kivágott WSDL részlet azáttekinthetőség végett.
SOAP WebService - HibakezelésSOAP Fault
Ha szerver oldalon hiba történik, SOAP Fault üzenetet illendő válaszkéntadni. A SOAP Fault jelzi a problémát (faultcode és faultstring), ésopcionálisan részleteket is közölhet (detail). Utóbbi egy Java kivételosztály XML szerializálásának eredménye lehet!� �1 2 3 4 soap:Server 5 Product does not exist in the catalog (name: lorem).6 7 8 209 Product does not exist in the catalog (name: lorem).
10 11 12 13 14 � �
Bedők Dávid (UNI-OBUDA) WebStore (soap-fault.tex) 2018-03-03 v1.0 23 / 43
ServiceError DTOws-ejbservice project� �1 package hu.qwaevisz.webstore.ejbservice.domain;2 [..]3 @XmlRootElement(name = "ServiceError")4 public class ServiceError implements Serializable {56 private final int code;7 private final String message;89 public ServiceError () { this(0, null); }
1011 public ServiceError(final int code , final String message) { [..] }1213 @XmlElement(name = "code")14 public int getCode () {15 return this.code;16 }1718 @XmlElement(name = "message")19 public String getMessage () {20 return this.message;21 }2223 @Override24 public String toString () {25 return "ServiceError [code=" + this.code + ", message=" + this.message + "]";26 }27 }� �
ServiceError.javaBedők Dávid (UNI-OBUDA) WebStore (service-error-dto.tex) 2018-03-03 v1.0 24 / 43
JAX-B : Alapértelmezés szerint az XML szerializálás@XmlAccessorType(XmlAccessType.PROPERTY) kon-figuráció szerint történik, vagyis a getter metódusokhatározzák meg a kiírandó mezőket.
Egyedi SOAP Fault üzenetws-webservice project� �1 package hu.qwaevisz.webstore.webservice.exception;2 [..]3 @WebFault(name = "WebStoreServiceFault", targetNamespace =
"http :// www.qwaevisz.hu/WebStore")4 public class WebStoreServiceException extends Exception {5 private final ServiceError faultInfo;6 public WebStoreServiceException(String message , ServiceError
faultInfo) {7 super(message);8 this.faultInfo = faultInfo;9 }
10 public WebStoreServiceException(String message , ServiceErrorfaultInfo , Throwable cause) {
11 super(message , cause);12 this.faultInfo = faultInfo;13 }14 public ServiceError getFaultInfo () {15 return this.faultInfo;16 }17 }� �
WebStoreServiceException.javaBedők Dávid (UNI-OBUDA) WebStore (custom-soap-fault.tex) 2018-03-03 v1.0 25 / 43
A kivétel dobása a @WebMethod-ból fog-ja indikálni a SOAP Fault elkészítését,amennyiben a kivétel @WebFault anno-tációval rendelkezik.
A kivétel message attribútuma kerül aSOAP Fault faultstring részébe. Deettől természetesen el lehet térni.
A getFaultInfo() getter metódus (ametódust így kell elnevezni) által vissza-adott DTO példány XML szerializálássorán bekerül a SOAP Fault detail ré-szébe.
SmartBear: SoapUIFunction és End-to-End teszt alkalmazás/platform
. https://www.soapui.org/
. Verzió: v5.4.0
. Telepítés: next-next-finish
. Ingyenes, open-source, létezik fizetős Pro változat is
. Function/End-to-End tesztelésre alkalmas eszköz• SOAP webszolgáltatások esetén• RESTful webszolgáltatások esetén• JMS támogatás (HermesJMS van integrálva)
. magas szinten támogatja a security szabvány megoldásokat(titkosítás, digitális aláírás, stb.)
Bedők Dávid (UNI-OBUDA) WebStore (soap-ui.tex) 2018-03-03 v1.0 26 / 43
https://www.soapui.org/
SmartBear: SoapUISOAP client készítése WSDL alapján
File | New SOAP project. Project name: WebStore. Initial WSDL:http://localhost:8080/webstore/WebStoreService?wsdl
. Create sample requests for all operations
. Creates a TestSuite for the imported WSDL
Ennyi?Ennyi. A WSDL minden szükséges információt tartalmaz ahhoz, hogy egy tel-jes körű kliens alkalmazást tudjon a SOAP UI készíteni. Nincs ebben semmi"különleges", egyetlen CLI command végrehajtásával ugyanezt mi is meg-tesszük majd. A WSDL-t nem szükséges elérhető URL-ként megadni, egy offlineXML állomány is megteszi.
Bedők Dávid (UNI-OBUDA) WebStore (soap-ui-create-client.tex) 2018-03-03 v1.0 27 / 43
http://localhost:8080/webstore/WebStoreService?wsdl
WebStoreService - AddProductws-webservice project
� �1 @WebMethod(action = "http ://www.qwaevisz.hu/WebStore/addProduct",
operationName = "AddProduct")2 public void addProduct(@WebParam(name = "Product") ProductStub
product) throws WebStoreServiceException {3 [..]4 }� �� �1 2 3 � �
SOAP Request� �1 � �SOAP Response
Bedők Dávid (UNI-OBUDA) WebStore (add-product.tex) 2018-03-03 v1.0 28 / 43
Webes vásárlás folyamata - I
SOAP Request SOAP Response� �1 2 423 � �
� �1 � �
� �1 � �
� �1 2 423 � �� �
1 2 SD85 4K
HDR3 � �
� �1 � �
A háttérben Stateful service → Pl. az Identifier megadása az egyes hívások kö-zött szükségtelen (ezt a viselkedést próbálja ez a kérés szimulálni), a szerver oldalona session szinten tárolunk állapotot, és ezáltal fognak a hívások azonos webkosárravonatkozni. Stateless esetén az adatokat pl. egy in-memory adatbázisban kelleneeltárolnunk, és minden kérésben szerepeltetni a kosár azonosítóját.
Bedők Dávid (UNI-OBUDA) WebStore (purchase-step-1.tex) 2018-03-03 v1.0 29 / 43
Az egyik TV-ből kettőt vásárolunk, ezért ezt az üzenetet 2xküldjük el, miközben egy másik TV-t is beteszünk a kosárba.
Webes vásárlás folyamata - II
SOAP Request SOAP Response� �1 � �
� �1 2 23 � �
� �1 � �
� �1 2 3 4
5 6 7
8 9
10 � �Bedők Dávid (UNI-OBUDA) WebStore (purchase-step-2.tex) 2018-03-03 v1.0 30 / 43
Java WebService kliens alkalmazás
Maga a WebService nyelvfüggetlen technológia, a WSDL birtokában bármilyennyelven készíthetünk klienst a Java nyelven írt szerverhez (a SoapUI -t isJava-ban írták, de a WSDL-en kívül semmit nem adtunk meg számára). Ettőlfüggetlenül természetesen írhatunk Java klienst mi magunk is, hiszen "csak"XML dokumentumokat kell egy adott endpoint-ra elküldenünk, tipikusanHTTP-n keresztül.De még ennél is egyszerűbb dolgunk van, ha megismerjük a wsimport nevűCLI alkalmazást, mely a Java JDK része.� �1 > cd ws-client2 > wsimport -s src/main/java -d bin -keep -p
hu.qwaevisz.webstore.client.generatedhttp :// localhost :8080/ webstore/WebStoreService?wsdl� �
A ws-client project lesz a kliens alkalmazás. Ennek src/main/java sour-ce könyvtárába, hu.qwaevisz.webstore.client.generated csomagnév-vel (és könyvtárstruktúrával) szeretnénk legenerálni a megadott URL-en elér-hető WSDL segítségével a kliens alkalmazásunkat.
Bedők Dávid (UNI-OBUDA) WebStore (java-client.tex) 2018-03-03 v1.0 31 / 43
Kliens alkalmazásws-client project� �1 URL endpoint = new
URL("http :// localhost :8080/ webstore/WebStoreService?wsdl");23 WebStoreService service = new WebStoreService(endpoint);4 WebStore webStore = service.getWebStorePort ();56 try {7 List products = webStore.listAllProducts ();89 for (ProductStub product : products) {
10 System.out.println("Product: " + product.getBrand () + ":" +product.getProductName () + " ( price: " +product.getPrice () + " $ )");
11 }12131415 } catch (WebStoreServiceException e) {16 e.printStackTrace ();17 }� �
Application.javaBedők Dávid (UNI-OBUDA) WebStore (application.tex) 2018-03-03 v1.0 32 / 43
A medadott URL jelen esetbennem lenne szükséges, hiszen azeredeti WSDL-ben is ez szerepel.Sokszor azonban a WSDL-ből kitör-lik a valós URL-t (security), ezérta kliensnek kell ezt megadnia. En-nek egyik legegyszerűbb módja abemutatott.
Kommunikáció megismert formái
Bedők Dávid (UNI-OBUDA) WebStore (communication.tex) 2018-03-03 v1.0 33 / 43
WebLogic változatMódosítások
Az alkalmazás gyakorlatban módosítás nélkül működik WebLogic alatt is.Az alábbi elemeket azonban figyelembe kell venni :
. log4j helyett JDK logging használata
. a weblogic elvárja hogy a Stateful Session Bean-ben lévő @Remoteéletciklus metódus business metódus is legyen, ezért fel kell venni azinterface-be� �
1 [..]2 @Local3 public interface WebBasketService {4 [..]56 void remove ();7 }� �
WebBasketService.java
Bedők Dávid (UNI-OBUDA) WebStore (weblogic.tex) 2018-03-03 v1.0 34 / 43
PMDForráskód elemző
. https://pmd.github.io/
. Verzió: v6.1.0
. Támogatott nyelvek: Java, JavaScript, PLSQL, Apache Velocity,XML, XSL
. Dokumentáció: https://pmd.github.io/pmd-6.1.0/
. Minden Rule egy RuleSet része.
. Java-hoz léteznek előre definiált RuleSet-ek, de sajátot is készíthetünk.
. Rule : név, leírás, prioritás, példa, implementáló osztály, illetveopcionális tulajdonságok halmaza (pl. CyclomaticComplexity ruleesetén a reportLevel egy Integer property).
Bedők Dávid (UNI-OBUDA) WebStore (pmd.tex) 2018-03-03 v1.0 35 / 43
https://pmd.github.io/https://pmd.github.io/pmd-6.1.0/
PMDPrioritások
1. A változtatás mindenképpen szükséges. A jelenlegi viselkedés hibás,kritikus hibát jelez.
2. A kód megváltoztatása erősen javallot. A jelenlegi megoldás nagyvalószínűséggel hibás.
3. A változtatás javasolt. A megvalósítás zavaró, talán hibás, avagy ellentmond az standard -eknek ill. best practice-eknek.
4. A változtatás opcionális. A jelenlegi kód valószínűleg nem hibás, csaknem követi a standard -eket, stílust, jó ízlést.
5. A változtatás nem szükséges. Nem árt, de olyan apróságot javítcsupán mint pl. a csomag/osztály nevek konzisztenciája.
Bedők Dávid (UNI-OBUDA) WebStore (pmd-priority.tex) 2018-03-03 v1.0 36 / 43
PMD és Maven integrációroot project� �1 2 3 3.84 5 6 7 8 9 org.apache.maven.plugins
10 maven -pmd -plugin 11 ${ version.plugin.pmd}12 13 14 /rulesets/java/basic.xml15 /rulesets/java/braces.xml16 17 18 19 20 21 22 � �
pom.xmlBedők Dávid (UNI-OBUDA) WebStore (pmd-maven.tex) 2018-03-03 v1.0 37 / 43
Az itt megadott ruleset-eknek mindenprojektre (minden modulra) érvényesnekkell lennie! A pmd ellenőrzést a mvnclean package pmd:pmd parancs fut-tatásával végezhetjük el.
PMD Szabály halmazok leíróipmd-bin-[version].zip | pmd-bin-[version].zip | lib | pmd-java-6.1.0.jar |rulesets | java | *.xml� �1 2 The Basic ruleset ..3 [..]4
10 Avoid jumbled ..11 312 13 14 15 16 17 18 19 � �
basic.xmlBedők Dávid (UNI-OBUDA) WebStore (pmd-rulesets.tex) 2018-03-03 v1.0 38 / 43
Ezeket az XML állományokatmásoljuk be pl. a root Gradleproject rulesets könyvtá-rába (pl. rulesets/basic.xml)
PMD finomhangolásaws-ejbservice project
Saját ruleset állományt legegyszerűbben úgy készíthetünk, hogy meglévőszabály halmazokat válogatunk össze, és ezeket - igény esetén -finomhangoljuk, konfiguráljuk (megváltoztatjuk eredeti beállításaikat).� �1 2 78 Custom ruleset 9
10 11 12 13 � �
ruleset.xml
Bedők Dávid (UNI-OBUDA) WebStore (pmd-finetuning-maven.tex) 2018-03-03 v1.0 39 / 43
PMD finomhangolásaSaját ruleset definiálása meglévők alapján� �1 23 45 6 7 89
11 112 1314 15 16 17 18 � �
ws-ejbservice | config | pmd | ruleset.xml
Bedők Dávid (UNI-OBUDA) WebStore (pmd-custom-ruleset.tex) 2018-03-03 v1.0 40 / 43
javadoc
A javadoc egy a JDK-val szállított ([JDK-HOME]/bin) dokumentum készítőeszköz. A forráskód helyét (-sourcepath) követően fel kell sorolni a csoma-got (hu.qwaevisz.webstore.dummy), amelyre a dokumentációt szeretnénkelkészíteni (alapértelmezetten HTML formátum, oracle java standard doclet).� �1 > javadoc -sourcepath ws -dummy/src/main/java
hu.qwaevisz.webstore.dummy� �Ha a forráskód lefordításához külső források is szükségesek (pl. saját doclet-et készítünk), akkor meg kell adni ezt is paraméterben (-classpath).� �1 > javadoc -classpath ws-common/build/classes/main -sourcepath
ws -dummy/src/main/java hu.qwaevisz.webstore.dummy� �
Bedők Dávid (UNI-OBUDA) WebStore (javadoc.tex) 2018-03-03 v1.0 41 / 43
javadoc és Maven integrációjavadoc készítése Maven segítségével� �1 2 [..]3 4 2.10.4 5 6 [..]7 8 9
10 11 org.apache.maven.plugins 12 maven -javadoc -plugin 13 ${ version.plugin.javadoc}14 15 16 17 18 � �
pom.xml� �1 > mvn site� �
Bedők Dávid (UNI-OBUDA) WebStore (javadoc-maven.tex) 2018-03-03 v1.0 42 / 43
Doclet
. A doclet-ek Java nyelven írt programok, melyek a Doclet API-thasználják hogy definiálják a tartalmát és formátumát a javadocalkalmazásnak.
. Alapértelmezés szerint a javadoc a standard oracle (sun) javadoclet-et használja (API dokumentáció létrehozása HTMLformátumban).
. A javadoc igazi ereje a saját doclet készítésének lehetőségében rejlik.
A docletpath a doclet-et tartalmazó forrás helye (megadható jar is1), míga doclet értéke az osztály full qualified neve lesz.� �1 > javadoc -classpath ws-common\build\classes\main -docletpath
ws -doclet\build\classes\main -doclethu.qwaevisz.webstore.doclet.WebStoreDoclet -sourcepathws -dummy\src\main\java -ws -filename ws.xmlhu.qwaevisz.webstore.dummy� �
1Ha több jar -t sorolunk fel a classpath vagy docletpath értékeiben, win esetén";", míg nix esetén ":" karaktert kell használni elválasztásra.
Bedők Dávid (UNI-OBUDA) WebStore (doclet.tex) 2018-03-03 v1.0 43 / 43