WebStore #maven. JAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc. Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 8


1 WebStore #maven JAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 8 ...
Author:  Aurél Biró

0 downloads 0 Views 3MB Size

Recommend Documents


Java Enterprise Edition. Inleiding
1 Java Enterprise Edition Inleiding J2EE => Java EE 5 => Java EE 6 => Java EE 7 Java EE 5 specificaties: HTTP/HTTPS (HyperText Transfer Proto...

Java Platform, Enterprise Edition (Java EE)
1 Java Platform, Enterprise Edition (Java EE) Marek Rychlý Vysoké učení technické v Brně Fakulta informačních techn...

Dunaújvárosi Egyetem. Gépészmérnöki alapképzési szak
1 Dunaújvárosi Egyetem Gépészmérnöki alapképzési szak Tanterv2 Tartalomjegyzék Tartalom T...

Java Enterprise Edition (Java EE): Web Application Development
1 Java Enterprise Edition (Java EE): Web Application Development COURSE NAME DURATION PRICE (RP) MIN PARTICIPANT Java Enterprise Edition (Java EE): We...

Veszprémi Egyetem. M szaki Informatikai Kar. Számítástudomány Alkalmazása Tanszék. M szaki informatika szak DIPLOMADOLGOZAT
1 Veszprémi Egyetem M szaki Informatikai Kar Számítástudomány Alkalmazása Tanszék M szaki informatika...

Java Enterprise Information Portals
1 De nieuwste categorie enterprise software heet Enterprise Information Portal (EIP). In dit artikel bespreekt Willem Koppenol een aantal bekende EIP ...

Java Enterprise Editie 7
1 βeta VZW (versie beta) Dit werk is gelicenseerd onder de licentie Creative Commons Naamsvermelding-GelijkDelen 4.0 Internationaal. Ga naar om...

IBM OmniFind Enterprise Edition
1 IBM OmniFind Enterprise Edition Versie 8.4 Enterprise Search beheren SC2 3 IBM OmniFind Enterprise Edition Versie 8.4 Enterprise Search beheren SC4 ...

Enterprise. RESTful Webservices. serieus alternatief voor SOAP?
1 12 Enterprise Paul Bakker is ontwikkelaar en trainer bij Info Support B.V. Blog: blogs/paul_bakker Het afgelopen jaar is er veel te doen geweest...

Webové služby v Java EE (JAX-WS)
1 Webové služby v Java EE (JAX-WS) Marek Rychlý Vysoké učení technické v Brně Fakulta informačních technolog...



WebStore #maven

JAX-WS SOAP WS, Stateful Session Bean, PMD, JavaDoc Óbudai Egyetem, Java Enterprise Edition Műszaki Informatika szak Labor 8

Bedők Dávid 2018-03-03 v1.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 "nem haszná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 RESTful webszolgá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 Services Security (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 úton legenerá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ában Kliens készítéshez csak és kizárólag a WSDL-re van szükség (ettől lesz a történet programozási nyelvek között szabadon átjárható, mégis közel olyan tí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 WSDLben) • 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 argumentumainak 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ó által definiált XSD típus információkra (XSD validáció). További előny hogy XSLT segítségével az üzenet válasza könnyen és egyértelműen átalakítható 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íg RPC esetén ez nagyon körülményes, bizonytalan. Az általunk választott konfigurá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 WSDLben) • BARE: nem csomagol semmit a SOAP üzenetekbe, ha olvasható eredményt szeretnénk, mi magunknak kell csomagoló osztályokat készítenünk (mind paraméterként, mind visszatérési értékként). A WSDL szintjén az operation, message és element részek nevei kü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 eredményezhet). A WSDL szintjén az operation, message és element ré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ése A megvalósítandó feladat példája alapján



1 < w s d l : d e f i n i tions [..] > 2 < wsdl:types > A WSDL egyes részei egymás elemeire vagy 3 < xs:schema xmlns:xs = " http: // www . w3 . org /2001/ XMLSchema " egészére hivatkoznak. A service hivatkoxmlns:tns = " http: // www . qwaevisz . hu / WebStore " e le m en t Fo r mD ef a ul t = " unqualified " zik a binding-ra, a binding a portTypet ar getNamespace = " http: // www . qwaevisz . hu / WebStore " ra és az azon belül definiált operationversion = " 1.0 " > [..] ökre, a portType operation-jei hivatkoz4 5 < wsdl:message name = " [..] " > [..] nak a message-ekre, a message-ek pedig 6 < wsdl:portType name = " WebStore " > a WSDL-ben megtalálható XSD schema ele7 < wsdl:o peration name = " [..] " > mekre (types rész). 8 < wsdl:input message = " [..] " name = " [..] " > 9 < wsdl:output message = " [..] " name = " [..] " > 10 < wsdl:fault message = " [..] " name = " [..] " > 11 12 13 < wsdl:binding name = " W e b S t o r e S e r v i c e S o a p B i n d i n g " type = " tns:WebStore " > 14 < soap:binding style = " document " transport = " http: // schemas . xmlsoap . org / soap / http " / > 15 < wsdl:o peration name = " [..] " > 16 < soap:operation soapAction = " [..] " style = " document " / > 17 < wsdl:input name = " [..] " > < soap:body use = " literal " / > 18 < wsdl:output name = " [..] " > < soap:body use = " literal " / > 19 < wsdl:fault name = " [..] " > < soap:fault name = " [..] " use = " literal " / > 20 21 22 < wsdl:service name = " WebStoreService " > 23 < wsdl:port binding = " t n s : W e b S t o r e S e r v i c e S o a p B i n d i n g " name = " WebStorePort " > 24 < soap:address location = " http: // localhost:8080 / webstore / WebStoreService " / > 25 26 27



Bedők Dávid (UNI-OBUDA)

WebStore (wsdl-overview.tex)

2018-03-03 v1.0



6 / 43

SOAP üzenetek - Request és Response 

1 < s o a p e n v : E n v elope xmlns:soapenv = " http: // schemas . xmlsoap . org / soap / envelope / " xmlns:web = " http: // www . qwaevisz . hu / WebStore " > 2 < soapen v:Header / > 3 < soapenv:Body > 4 < w e b : L i s t A l l P r od u c t s / > 5 6





SOAP Request A http://schemas.xmlsoap.org/soap/envelope/ névtér határozza meg az alap elemeket és attribútumokat (pl. Envelope, Header, Body, stb), míg a http://www.qwaevisz.hu/WebStore névtér a saját alkalmazásunk névtere, amit majd definiálni fogunk (pl. ListAllProducts, ListAllProductsResponse).



1 < soap:Envelope xmlns:soap = " http: // schemas . xmlsoap . org / soap / envelope / " > 2 < soap:Body > 3 < n s 2 : L i s t A l l P r o d u c t s R e s p o n s e xmlns:ns2 = " http: // www . qwaevisz . hu / WebStore " > 4 < Product brand = " SONY " productName = " ZD9 4 K HDR " price = " 1499 " / > 5 < Product brand = " SONY " productName = " SD85 4 K HDR " price = " 1299 " / > 6 < Product brand = " SONY " productName = " XD83 4 K HDR " price = " 1299 " / > 7 < Product brand = " PHILIPS " productName = " 40 PFH5500 Smart Led " price = " 999 " / > 8 < Product brand = " PANASONIC " productName = " TX -40 CS620E LED " price = " 1350 " / > 9 < Product brand = " PANASONIC " productName = " TX -58 DX800E " price = " 699 " / > 10 11 12





SOAP Response Bedők Dávid (UNI-OBUDA)

WebStore (soap-messages.tex)

2018-03-03 v1.0

7 / 43

WebStore SOAP 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ékeket memó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 kezelé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 felhaszná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

WebStore Követelmények

. A vásárló a kosárnak adhasson egy azonosítót/nevet, melyet beállítás után vissza is kérhet (csupán demonstrációs cél). Ha névtelen kosár nevét kérjük le, a rendszer adjon SOAP Fault hibaüzenetet a felhaszná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ű Java kliens 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ése Module-ok elhelyezkedése

Bedők Dávid (UNI-OBUDA)

WebStore (webstore-overview.tex)

2018-03-03 v1.0

10 / 43

Persistence layer ws-persistence project

 1 2 3 4 5 6 7 8 9

A StoreHolder Singleton Ses-

@Local sion Bean tárolja (és inicialipublic interface StoreHolder { zálja) a saját domain típusovoid create ( Product product ) ; kat (Brand és Product), míg Product read ( String name ) ; List < Product > readAll ( String nameTerm )a;PersistenceService Stateless List < Product > readAll ( Brand brand ) ; Session Bean ehhez biztosít hozList < Product > readAll () ; záférést az EJB service réteg szolvoid delete ( String name ) ; gáltatásai számára. }

 



StoreHolder.java

1 @Local 2 public interface P er s is t en c eS e rv ic e { 3 void create ( Product product ) throws P e r s i s t e n c e E x c e p t i o n ; 4 Product read ( String name ) throws P e r s i s t e n c e E x c e p t i o n ; 5 List < Product > readAll ( String nameTerm ) throws P e r s i s t e n c e E x c e p t i o n ; 6 List < Product > readAll ( Brand brand ) throws P e r s i s t e n c e E x c e p t i o n ; 7 List < Product > readAll () throws P e r s i s t e n c e E x c e p t i o n ; 8 void delete ( String name ) throws P e r s i s t e n c e E x c e p t i o n ; 9 }





PersistenceService.java Bedők Dávid (UNI-OBUDA)

WebStore (persistence-services.tex)

2018-03-03 v1.0

11 / 43

Adatmodell ws-persistence és ws-ejbservice project

A Basket osztály tartalmaz üzleti metódusokat is a webkosár kezeléséhez (increment(), decrement(), getSize(), getTotal()).

. 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ók A stub-ok XML Bind annotációkkal vannak gazdagítva, hiszen ezek részt vesznek a SOAP 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 vannak definiálva. @XmlAccessorType(XmlAccessType.PROPERTY) : Az annotációk a getter metódusokon vannak definiálva. Bedők Dávid (UNI-OBUDA)

WebStore (domain.tex)

2018-03-03 v1.0

12 / 43

XML Binding  1 2

@XmlAttribute ( name = " productName " ) private String name ;



A FIELD alapú elérésre példa a termék neve, mely esetén a SOAP-ban szereplő ü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 a camelCase írásmód az elterjedt, illetve ez az annotáció nem alkalmazható összetett típusokra.





1 2

@XmlAttribute ( name = " total " ) 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 2

@XmlElement ( name = " Items " ) public List < BasketItem > getItems () {..}



Listák, tömbök, halmazok esetén a megadott elem név (@XmlElement annotáció) a gyermek elemek csoportosító elem neve lesz. Element-ek esetén az elterjedt írásmód XML-ben a CamelCase, mely eltér a Java elnevezé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és ws-ejbservice project

A ServiceError tartalmából fogunk későbbiekben SOAP Fault custom hibaüzenetet (XML) gyártani. Természetesen most is az EJB réteg kivételt fog dobni hiba esetén (ServiceException), melybe elcsomagolunk egy hibakódot (WebStoreError enum: IDENTIFIER, PERSISTENCE, PRODUCT, BASKET).

Rétegek közötti függőség A nyilvános interface-ek felé (SOAP) az EJB szolgáltatások rétege a már megismert minták alapján a Product és Brand példányokból stub-okat készít a ProductConverter Stateless Session Bean segítségével. Vegyük észre, hogy attól függetlenül, hogy az adatokat memóriában tároljuk, az EJB service felépítése azonos 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 úgy vezethetjü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ások ws-ejbservice project

 1 2 3 4 5 6 7 8 9

@Local Stateful Session Bean public interface W e b B as k e t S e r v i c e { void setIdentifier ( String identifier ) throws S e r v i c e E x c e p t i o n ; String getIdentifier () throws S e r v i c e E x c e p t i o n ; int getBasketSize () throws S e r v i c e E x c e p t i o n ; void addItem ( String productName ) throws S e r v i c e E x c e p t i o n ; void removeItem ( String productName ) throws S e r v i c e E x c e p t i o n ; Basket getContent () throws S e r v i c e E x c e p t i o n ; }

 

1 2 3 4 5 6 7 8 9



WebBasketService.java

@Local Stateless Session Bean public interface StoreService { void add ( ProductStub product ) throws S e r v i c e E x c e p t i o n ; ProductStub get ( String name ) throws S e r v i c e E x c e p t i o n ; List < ProductStub > list ( String nameTerm ) throws S e r v i c e E x c e p t i o n ; List < ProductStub > list ( BrandStub brand ) throws S e r v i c e E x c e p t i o n ; List < ProductStub > getAll () throws S e r v i c e E x c e p t i o n ; void remove ( String name ) throws S e r v i c e E x c e p t i o n ; }





StoreService.java Bedők Dávid (UNI-OBUDA)

WebStore (ejbservice-services.tex)

2018-03-03 v1.0

15 / 43

Stateful Session Bean . Az implementációt tartalmazó osztály rendelkezik a @Stateful annotációval. . Az osztály tartalmazhat instance field-eket, melyek állapota session-önként értelmezett. Ha ugyanaz a session ismét meghívja a SFSB egy másik metódusát, az EJB container olyan állapotú példányt ad 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 a session már invalid, nem elérhető (pl. timeout miatt).

Állapotkezelés A 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-Driven Bean-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 nem használja a user ◦ @PrePassivate és @PostActivate metódusok készíthetőek @PostConstruct és @PreDestroy metódus mindegyik típusú Session Bean-hez készíthető. Bedők Dávid (UNI-OBUDA)

WebStore (session-beans-lifecycle.tex)

2018-03-03 v1.0

17 / 43

WebStoreService - Keret ws-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 , paramet erStyle = Para meterStyle . WRAPPED ) 5 public class WebStoreService { Névtér beállítások a @WebService annotáció, 6 [..] míg konfigurációs elemek a @SOAPBinding an7 @EJB 8 private StoreService storeService ; notáció segítségével valósíthatóak meg. 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 W e b S t o r e S e r v i c e E x c e p t i o n ( e . getMessage () , e . getError () ) ; 17 } 18 } 19 [..] 20 }





WebStoreService.java Bedők Dávid (UNI-OBUDA)

WebStore (webstoreservice-frame.tex)

2018-03-03 v1.0

18 / 43

WebStoreService - GetProduct ws-webservice project

A @WebMethod annotációval ellátott metódus lesz egy művelet/üzenet pár a webszolgáltatásban. Az annotáció attribútumaival tudjuk részletesen konfigurálni, hogy milyen néven jelenik meg majd mindez a WSDL-ben (mindezekre kihatnak a konfigurációs beállítások is). Ha az operation neve GetProduct (és ez element-ként megjelenik az SOAP Request-ben), akkor erre a válasz a SOAP Response-ban GetProductResponse 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éldány egy Product elembe lesz visszaküldve a SOAP Response-ban. Ha nem definiáljuk a @WebResult-ot, akkor egy return elemben jelenik meg a ProductStub XML szerializációja (az @XmlRootElement annotáció jelen konfiguráció esetén nem szá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 < s o a p e n v : E n v elope xmlns:soapenv = " http: // schemas . xmlsoap . org / soap / envelope / " xmlns:web = " http: // www . qwaevisz . hu / WebStore " > 2 < soapen v:Header / > 3 < soapenv:Body > 4 < web:GetProduct > 5 < Name > SD85 4 K HDR 6 7 8

 



SOAP Request

1 < soap:Envelope xmlns:soap = " http: // schemas . xmlsoap . org / soap / envelope / " > 2 < soap:Body > 3 < n s 2 : G e t P r o d u c t R e s p o n s e xmlns:ns2 = " http: // www . qwaevisz . hu / WebStore " > 4 < Product brand = " SONY " productName = " SD85 4 K HDR " price = " 1299 " / > 5 6 A brand, productName és price attribútum nevek a ProductStub 7



XML Bind annotációin keresztül konfigurálhatóak.



SOAP Response

Hibaesetek kezelése Ha 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 esik keresztül. Bedők Dávid (UNI-OBUDA)

WebStore (soap-messages-getproduct.tex)

2018-03-03 v1.0

20 / 43

WSDL - Termék lekérdezése Típus információk



1 < xs:schema xmlns:xs = " http: // www . w3 . org /2001/ XMLSchema " xmlns:tns = " http: // www . qwaevisz . hu / WebStore " > 2 < xs:element name = " GetProduct " type = " tns:GetProduct " / > 3 < xs:element name = " G e tP r od u ct R es po n se " type = " t n s : G e t P r o d u c t R e s p o n s e " / > 4 < xs:element name = " Product " type = " tns:productStub " / > 5 < xs:com plexType name = " GetProduct " > 6 < xs:sequence > 7 < xs:element minOccurs = " 0 " name = " Name " type = " xs:string " / > 8 9 10 < xs:com plexType name = " G e tP r od u ct R es po n se " > 11 < xs:sequence > 12 < xs:element minOccurs = " 0 " ref = " tns:Product " / > 13 14 15 < xs:com plexType name = " productStub " > 16 < xs:sequence / > 17 < xs:attribute name = " brand " type = " tns:brandStub " / > 18 < xs:attribute name = " productName " type = " xs:string " / > 19 < xs:attribute name = " price " type = " xs:int " use = " required " / > 20 21 < xs:simpleType name = " brandStub " > 22 < xs:res triction base = " xs:string " > A típus információkhoz egyrészt a http: 23 < xs:enumeration value = " PHILIPS " / > //www.w3.org/2001/XMLSchema namespace 24 < xs:enumeration value = " SONY " / > alatti értékeket (pl. int, string), másrészt 25 < xs:enumeration value = " PANASONIC " / > az alkalmazás saját névtere (http://www. 26 qwaevisz.hu/WebStore) által bevezetett tí27 pusok használhatóak. 28 [..] 29



Bedők Dávid (UNI-OBUDA)

WebStore (wsdl-getproduct-types.tex)

2018-03-03 v1.0



21 / 43

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



< wsdl:message name = " GetProduct " > < wsdl:part element = " tns:GetProduct " name = " parameters " > < wsdl:message name = " G et Pr o du c tR e sp o ns e " > < wsdl:part element = " t n s : G e t P r o d u c t R e s p o n s e " name = " parameters " > Hivatkoznak a típus definíciókra. < wsdl:message name = " W e b S t o r e S e r v i c e E x c e p t i o n " > < wsdl:part element = " t n s : W e b S t o r e S e r v i c e F a u l t " name = " W e b S t o r e S e r v i c e E x c e p t i o n " > < wsdl:portType name = " WebStore " > < wsdl:o peration name = " GetProduct " > < wsdl:input message = " tns:GetProduct " name = " GetProduct " > < wsdl:output message = " t n s : G e t P r o d u c t R e s p o n s e " name = " G et P ro d uc t Re s po n se " > < wsdl:fault [..] / > < wsdl:binding name = " W e b S t o r e S e r v i c e S o a p B i n d i n g " type = " tns:WebStore " > < wsdl:o peration name = " GetProduct " > < soap:o peration soapAction = " http: // www . qwaevisz . hu / WebStore / getProduct " style = " document " / > < wsdl:input name = " GetProduct " > < soap:body use = " literal " / > A hibakezeléshez kapcsolódó típu sokat és üzeneteket nem tartal< wsdl:output name = " Ge t Pr o du c tR e sp o ns e " > mazza a kivágott WSDL részlet az < soap:body use = " literal " / > áttekinthetőség végett. [..] Bedők Dávid (UNI-OBUDA) WebStore (wsdl-getproduct-messages.tex) 2018-03-03 v1.0 22 / 43





SOAP WebService - Hibakezelés SOAP Fault

Ha szerver oldalon hiba történik, SOAP Fault üzenetet illendő válaszként adni. A SOAP Fault jelzi a problémát (faultcode és faultstring), és opcionálisan részleteket is közölhet (detail). Utóbbi egy Java kivétel osztály XML szerializálásának eredménye lehet! 

1 < soap:Envelope xmlns:soap = " http: // schemas . xmlsoap . org / soap / envelope / " > 2 < soap:Body > 3 < soap:Fault > 4 < faultcode > soap:Server 5 < faultstring > Product does not exist in the catalog ( name: lorem ) . 6 < detail > 7 < n s 2 : W e b S t o r e S e r v i c e F a u l t xmlns:ns2 = " http: // www . qwaevisz . hu / WebStore " > 8 < code > 20 9 < message > 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 DTO ws-ejbservice project 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



package hu . qwaevisz . webstore . ejbservice . domain ; [..] @ Xm lR o ot El e ment ( name = " ServiceError " ) public class ServiceError implements Serializable { private final int code ; private final String message ; public ServiceError () { this (0 , null ) ; } public ServiceError ( final int code , final String message ) { [..] } @XmlElement ( name = " code " ) public int getCode () { return this . code ; } @XmlElement ( name = " message " ) public String getMessage () { return this . message ; }

JAX-B : Alapértelmezés szerint az XML szerializálás @XmlAccessorType(XmlAccessType.PROPERTY) konfiguráció szerint történik, vagyis a getter metódusok határozzák meg a kiírandó mezőket.

@Override public String toString () { return " ServiceError [ code = " + this . code + " , message = " + this . message + " ] " ; }

}

 ServiceError.java

Bedők Dávid (UNI-OBUDA)

WebStore (service-error-dto.tex)

2018-03-03 v1.0

24 / 43

Egyedi SOAP Fault üzenet ws-webservice project

 1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17

package hu . qwaevisz . webstore . webservice . exception ; [..] @WebFault ( name = " W e b S t o r e S e r v i c e F a u l t " , t a rg et N am e sp ac e = " http :// www . qwaevisz . hu / WebStore " ) public class W e b S t o r e S e r v i c e E x c e p t i o n extends Exception { private final ServiceError faultInfo ; public W e b S t o r e S e r v i c e E x c e p t i o n ( String message , ServiceError faultInfo ) { A kivétel dobása a @WebMethod-ból fogsuper ( message ) ; ja indikálni a SOAP Fault elkészítését, this . faultInfo = faultInfo ; amennyiben a kivétel @WebFault annotációval rendelkezik. } public W e b S t o r e S e r v i c e E x c e p t i o n ( String message , ServiceError A kivétel message attribútuma kerül a faultInfo , Throwable cause ) { SOAP Fault faultstring részébe. De super ( message , cause ) ; ettől természetesen el lehet térni. this . faultInfo = faultInfo ; } A getFaultInfo() getter metódus (a public ServiceError getFaultInfo () {metódust így kell elnevezni) által visszaadott DTO példány XML szerializálás return this . faultInfo ; során bekerül a SOAP Fault detail ré} szébe. }





WebStoreServiceException.java Bedők Dávid (UNI-OBUDA)

WebStore (custom-soap-fault.tex)

2018-03-03 v1.0

25 / 43

SmartBear: SoapUI Function é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

SmartBear: SoapUI SOAP 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 teljes 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 megtesszük majd. A WSDL-t nem szükséges elérhető URL-ként megadni, egy offline XML állomány is megteszi. Bedők Dávid (UNI-OBUDA)

WebStore (soap-ui-create-client.tex)

2018-03-03 v1.0

27 / 43

WebStoreService - AddProduct ws-webservice project

 1 2 3 4

1 2 3

@WebMethod ( action = " http :// www . qwaevisz . hu / WebStore / addProduct " , operationName = " AddProduct " ) public void addProduct ( @WebParam ( name = " Product " ) ProductStub product ) throws W e b S t o r e S e r v i c e E x c e p t i o n { [..] }

 

< web:Ad dProdu ct > < Product brand = " PHILIPS " productName = " 55 PFT6510 /12 3 D SMART Ambilight " price = " 2499 " / >

 

1





SOAP Request

< ns2:AddProductResponse xmlns:ns2 = " http: // www . qwaevisz . hu / WebStore " / >





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 3

< SetBasketIdentifier > < Identifier > 42



 1 < GetBasketIdentifier /> 

1



 1



2 3

 1 2 3

< A dd It e mT oB a sk e t > < ProductName > SD85 4 K HDR



 < SetBasketIdentifierResponse />  

1

< GetBasketIdentifierResponse > < Identifier > 42





 < AddItemToBasketResponse /> 



Az egyik TV-ből kettőt vásárolunk, ezért ezt az üzenetet 2x küldjük el, miközben egy másik TV-t is beteszünk a kosárba.

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 oldalon a session szinten tárolunk állapotot, és ezáltal fognak a hívások azonos webkosárra vonatkozni. Stateless esetén az adatokat pl. egy in-memory adatbázisban kellene eltá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

Webes vásárlás folyamata - II SOAP Request  1 < GetBasketSize / > 

SOAP Response 

1

3 2

1 2 3 4

1

 5 < GetBasketContent />  6 7

8 9 10

Bedők Dávid (UNI-OBUDA)

< GetBasketSizeResponse > < BasketSize >2

 



< GetBasketContentResponse > < Basket identifier = " 42 " total = " 3448 " > < Item quantity = " 2 " total = " 2598 " > < Product brand = " SONY " productName = " SD85 4 K HDR " price = " 1299 " / > < Item quantity = " 1 " total = " 850 " > < Product brand = " PHILIPS " productName = " 55 PUH6400 UHD Smart Led " price = " 850 " / >



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ármilyen nyelven készíthetünk klienst a Java nyelven írt szerverhez (a SoapUI -t is Java-ban írták, de a WSDL-en kívül semmit nem adtunk meg számára). Ettől függetlenül természetesen írhatunk Java klienst mi magunk is, hiszen "csak" XML dokumentumokat kell egy adott endpoint-ra elküldenünk, tipikusan HTTP-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 2

> cd ws - client > wsimport -s src / main / java -d bin - keep -p hu . qwaevisz . webstore . client . generated http :// localhost :8080/ webstore / W e bS to r eS er v ic e ? wsdl



A ws-client project lesz a kliens alkalmazás. Ennek src/main/java source könyvtárába, hu.qwaevisz.webstore.client.generated csomagnévvel (és könyvtárstruktúrával) szeretnénk legenerálni a megadott URL-en elérhető 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ás ws-client project

 1

URL endpoint = new URL ( " http :// localhost :8080/ webstore / We b St o re Se r vi ce ? wsdl " ) ;

2 3 4

W eb St o re S er vi c e service = new W eb St o re Se r vi ce ( endpoint ) ; WebStore webStore = service . g e tW e bS to r eP or t () ;

5 6 7

try { List < ProductStub > products = webStore . l i st A ll Pr o du ct s () ;

8 9 10

11 12 13 14 15 16 17

for ( ProductStub product : products ) { System . out . println ( " Product : " + product . getBrand () + " : " + product . ge tProdu ctName () + " ( price : " + product . getPrice () + " $ ) " ) ; A medadott URL jelen esetben } nem lenne szükséges, hiszen az eredeti WSDL-ben is ez szerepel. Sokszor azonban a WSDL-ből kitörlik a valós URL-t (security ), ezért a kliensnek kell ezt megadnia. En} catch ( W e b S t o r e S e r v i c e E x c e p t i o n e ) { nek egyik legegyszerűbb módja a e . p ri nt S ta ck T ra ce () ; bemutatott. }





Application.java Bedők Dávid (UNI-OBUDA)

WebStore (application.tex)

2018-03-03 v1.0

32 / 43

Kommunikáció megismert formái

Bedők Dávid (UNI-OBUDA)

WebStore (communication.tex)

2018-03-03 v1.0

33 / 43

WebLogic változat Mó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

 1 2 3 4

. 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 az interface-be

[..] @Local public interface W e b B as k e t S e r v i c e { [..]

5

void remove () ;

6 7

}



 WebBasketService.java

Bedők Dávid (UNI-OBUDA)

WebStore (weblogic.tex)

2018-03-03 v1.0

34 / 43

PMD Forrá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, illetve opcionális tulajdonságok halmaza (pl. CyclomaticComplexity rule esetén a reportLevel egy Integer property ).

Bedők Dávid (UNI-OBUDA)

WebStore (pmd.tex)

2018-03-03 v1.0

35 / 43

PMD Prioritá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 nagy valószínűséggel hibás. 3. A változtatás javasolt. A megvalósítás zavaró, talán hibás, avagy ellent mond 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, csak nem 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ít csupá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 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22

< project [..] > < properties > < version . plugin . pmd > 3.8 < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < artifactId > maven - pmd - plugin < version > ${ version . plugin . pmd } < configuration > < rulesets > < ruleset >/ rulesets / java / basic . xml < ruleset >/ rulesets / java / braces . xml Az itt megadott ruleset-eknek minden projektre (minden modulra) érvényesnek kell lennie ! A pmd ellenőrzést a mvn clean package pmd :pmd parancs fut tatásával végezhetjük el.



Bedők Dávid (UNI-OBUDA)

WebStore (pmd-maven.tex)

2018-03-03 v1.0



37 / 43

PMD Szabály halmazok leírói pmd-bin-[version].zip | pmd-bin-[version].zip | lib | pmd-java-6.1.0.jar | rulesets | java | *.xml



1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19

< ruleset name = " Basic " xmlns = " http: // pmd . sourceforge . net / ruleset /2.0.0 " > < description > The Basic ruleset .. [..] < rule name = " J u m b l e d I n c r e m e n t e r " language = " java " since = " 1.0 " message = " Avoid modifying .. " class = " net . sourceforge . pmd . lang . rule . XPathRule " e xt er n al In f oU r l = " https: // pmd . github . io /.. " > < description > Avoid jumbled .. < priority >3 < properties > Ezeket az XML állományokat < property name = " xpath " > másoljuk be pl. a root Gradle < value > project rulesets könyvtá rába (pl. rulesets/basic. xml) < example >





basic.xml Bedők Dávid (UNI-OBUDA)

WebStore (pmd-rulesets.tex)

2018-03-03 v1.0

38 / 43

PMD finomhangolása ws-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 < ruleset name = " Custom ruleset " 3 xmlns = " http: // pmd . sf . net / ruleset /1.0.0 " 4 xmlns:xsi = " http: // www . w3 . org /2001/ XMLSchema - instance " 5 x s i : s c h e m aL o ca t io n = " http: // pmd . sf . net / ruleset /1.0.0 http: // pmd . sf . net / ru l es e t_ x ml _ sc he m a . xsd " 6 x s i : n o N a m e s p a c e S c h e m a L o c a t i o n = " http: // pmd . sf . net / r ul e se t _x m l_ s ch em a . xsd " > 7 8 < description > Custom ruleset 9 10 < rule ref = " [..] " / > 11 < rule ref = " [..] " / > 12 < rule ref = " [..] " / > 13





ruleset.xml

Bedők Dávid (UNI-OBUDA)

WebStore (pmd-finetuning-maven.tex)

2018-03-03 v1.0

39 / 43

PMD finomhangolása Saját ruleset definiálása meglévők alapján

 1

< rule ref = " rulesets / basic . xml " / >

2 3

< rule ref = " rulesets / unusedcode . xml / U n u s e d L o c a l V a r i a b l e " / >

4 5 6 7

< rule ref = " rulesets / braces . xml " > < exclude name = " F o r L o o p s M u s t U s e B r a c e s " / >

8 9 10 11 12

< rule ref = " rulesets / basic . xml / F o r L o o p S h o u l d B e W h i l e L o o p " message = " IMPORTANT ! This for loop could be simplified to a while loop " > < priority >1

13 14 15 16 17 18

< rule ref = " rulesets / codesize . xml / C y c l o m a t i c C o m p l e x i t y " > < properties > < property name = " reportLevel " value = " 10 " / >





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 csomagot (hu.qwaevisz.webstore.dummy), amelyre a dokumentációt szeretnénk elké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 docletet 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 5 6 7 8 9 10 11 12 13 14 15 16 17 18

< project [..] > [..] < properties > < version . plugin . javadoc > 2.10.4 [..] < build > < pluginManagement > < plugins > < plugin > < groupId > org . apache . maven . plugins < artifactId > maven - javadoc - plugin < version > ${ version . plugin . javadoc }



 1 > mvn site  Bedők Dávid (UNI-OBUDA)



pom.xml  WebStore (javadoc-maven.tex)

2018-03-03 v1.0

42 / 43

Doclet . A doclet-ek Java nyelven írt programok, melyek a Doclet API-t használják hogy definiálják a tartalmát és formátumát a javadoc alkalmazásnak. . Alapértelmezés szerint a javadoc a standard oracle (sun) java doclet-et használja (API dokumentáció létrehozása HTML formá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íg a doclet értéke az osztály full qualified neve lesz. 

1

> javadoc - classpath ws - common \ build \ classes \ main - docletpath ws - doclet \ build \ classes \ main - doclet hu . qwaevisz . webstore . doclet . W ebStor eDocle t - sourcepath ws - dummy \ src \ main \ java -ws - filename ws . xml hu . qwaevisz . webstore . dummy



1



Ha 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

Life Enjoy

" Life is not a problem to be solved but a reality to be experienced! "

Get in touch

Social

© Copyright 2013 - 2018 TIXPDF.COM - All rights reserved.