Útmutató az Apache CXF-hez tavasszal
1. Áttekintés
Ez az oktatóanyag a és a konfigurálásra összpontosít az Apache CXF keretrendszer használata Spring-szel együtt - Java vagy XML konfigurációval.
Ez az Apache CXF sorozat második része; az első a CXF alapjaira összpontosított, mint a JAX-WS szabványos API-k implementációja.
2. Maven-függőségek
Az előző oktatóanyaghoz hasonlóan a következő két függőséget is fel kell venni:
org.apache.cxf cxf-rt-frontend-jaxws 3.1.6 org.apache.cxf cxf-rt-transports-http 3.1.6
Az Apache CXF műtermékek legújabb verzióinak megtekintéséhez keresse fel az apache-cxf fájlt.
Ezenkívül a következő függőségekre van szükség a tavasz támogatásához:
org.springframework spring-context 4.3.1.RELEASE org.springframework spring-webmvc 4.3.1.RELEASE
A tavaszi leletek legújabb verziói itt találhatók.
Végül, mivel programozatosan konfiguráljuk az alkalmazást a hagyományos helyett a Java Servlet 3.0+ API-val web.xml telepítési leíró, szükségünk lesz az alábbi műtárgyra:
javax.servlet javax.servlet-api 3.1.0
Itt találhatjuk meg a Servlet API legújabb verzióját.
3. Szerveroldali alkatrészek
Most nézzük meg azokat az összetevőket, amelyeknek jelen kell lenniük a szerver oldalon a webszolgáltatás végpontjának közzétételéhez.
3.1. WebApplicationInitilizer Felület
A WebApplicationInitializer interfész van megvalósítva a ServletContext felület az alkalmazáshoz. Amikor az osztályúton van, annak Indításkor metódust a servlet tároló automatikusan meghívja, majd a ServletContext példányosított és inicializált.
Így határozható meg egy osztály a WebApplicationInitializer felület:
public class AppInitializer implementálja a WebApplicationInitializer {@Override public void onStartup (ServletContext container) {// Metód implementáció}}
A Indításkor() A módszer az alább látható kódrészletek segítségével valósul meg.
Először egy Spring alkalmazáskörnyezetet hoznak létre és konfigurálnak egy konfigurációs metaadatokat tartalmazó osztály regisztrálására:
AnnotationConfigWebApplicationContext context = új AnnotationConfigWebApplicationContext (); context.register (ServiceConfiguration.class);
A ServiceConfiguration osztályt a @ Konfiguráció annotáció a babdefiníciók megadásához. Ezt az osztályt a következő alfejezet tárgyalja.
A következő részlet azt mutatja be, hogy a tavaszi alkalmazáskörnyezet hogyan kerül hozzáadásra a szervlet kontextushoz:
container.addListener (új ContextLoaderListener (context));
A CXFServlet osztályt, amelyet az Apache CXF határoz meg, generálják és regisztrálják a bejövő kérések kezelésére:
ServletRegistration.Dynamic diszpécser = container.addServlet ("diszpécser", új CXFServlet ());
Az alkalmazás kontextusa betölt egy konfigurációs fájlban definiált Spring elemeket. Ebben az esetben a szervlet neve az cxf, ezért a kontextus a megnevezett fájlban keresi az elemeket cxf-servlet.xml alapértelmezés szerint.
Végül a CXF szervlet egy relatív URL-hez van hozzárendelve:
diszpécser.addMapping ("/ szolgáltatások");
3.2. A jó öreg web.xml
Alternatív megoldásként, ha egy (kissé régimódi) telepítési leírót akarunk használni, nem pedig a WebApplicationInitilizer interfész, a megfelelő web.xml a fájlnak a következő servlet-definíciókat kell tartalmaznia:
cxf org.apache.cxf.transport.servlet.CXFServlet 1 cxf / services / *
3.3. ServiceConfiguration Osztály
Vessünk egy pillantást a szolgáltatás konfigurációjára - először egy alapvető csontváz, amely mellékeli a webes szolgáltatás végpontjának babdefinícióit:
@Configuration public class ServiceConfiguration {// Bean definíciók}
Az első szükséges bab a SpringBus - amely az Apache CXF kiterjesztéseit biztosítja a Spring Framework használatához:
@Bean public SpringBus springBus () {return new SpringBus (); }
An EnpointImpl babot is létre kell hozni a SpringBus bab és egy webes szolgáltatás megvalósító. Ezt a babot használják a végpont közzétételéhez a megadott HTTP-címen:
@Bean public Endpoint endpoint () {EndpointImpl endpoint = new EndpointImpl (springBus (), new BaeldungImpl ()); endpoint.publish ("// localhost: 8080 / services / baeldung"); visszatérési végpont; }
A BaeldungImpl osztály a webszolgáltatási felület megvalósítására szolgál. Meghatározását a következő alfejezet tartalmazza.
Alternatív megoldásként deklarálhatjuk a szerver végpontját egy XML konfigurációs fájlban is. Pontosabban az cxf-servlet.xml Az alábbi fájl a web.xml a 3.1. szakaszban definiált telepítési leíró, és pontosan ugyanazt a végpontot írja le:
Ne feledje, hogy az XML konfigurációs fájl a kiszolgálónévről van elnevezve, amely a telepítési leíróban van megadva cxf.
3.4. Típusdefiníciók
Következő - itt van a megvalósító amelyet már említettünk az előző alfejezetben:
@WebService (endpointInterface = "com.baeldung.cxf.spring.Baeldung") nyilvános osztály BaeldungImpl valósítja meg Baeldung {private int counter; public String hello (String name) {return "Hello" + név + "!"; } nyilvános húrregiszter (hallgató) {számláló ++; return student.getName () + "a regisztrált hallgató száma" + számláló; }}
Ez az osztály biztosítja a Baeldung végpont interfész, amelyet az Apache CXF tartalmazni fog a közzétett WSDL metaadatokban:
@WebService nyilvános felület Baeldung {String hello (String name); Vonós regiszter (hallgató hallgató); }
Mind a végpont interfész, mind a megvalósító használja ki a Diák osztály, amelyet a következőképpen határozunk meg:
public class Student {private String name; // kivitelezők, szerelvények és beállítók}
4. Ügyféloldali bab
A tavaszi keret előnyeinek kihasználásához babot hirdetünk az a @ Konfiguráció kommentált osztály:
@Configuration public class ClientConfiguration {// Bean definíciók}
Bab nevű bab ügyfél meghatározása:
@Bean (név = "kliens") public Object geneProxy () {return proxyFactoryBean (). Create (); }
A ügyfél bab képviseli a Baeldung webes szolgáltatás. Létrehozása a teremt módszer a JaxWsProxyFactoryBean bab, gyár a JAX-WS proxyk létrehozására.
A JaxWsProxyFactoryBean Az objektum létrehozása és konfigurálása a következő módszerrel történik:
@Bean public JaxWsProxyFactoryBean proxyFactoryBean () {JaxWsProxyFactoryBean proxyFactory = új JaxWsProxyFactoryBean (); proxyFactory.setServiceClass (Baeldung.class); proxyFactory.setAddress ("// localhost: 8080 / services / baeldung"); return proxyFactory; }
A gyáré serviceClass tulajdonság a webszolgáltatás felületét jelöli, míg a cím tulajdonság a proxy URL-címét jelzi a távoli meghívásokhoz.
Az ügyféloldali tavaszi bab esetében is visszatérhet egy XML konfigurációs fájlba. A következő elemek ugyanazokat a babokat deklarálják, mint amelyeket a fentiekben programozottan konfiguráltunk:
5. Tesztesetek
Ez a szakasz az Apache CXF Spring támogatásának bemutatásához használt teszteseteket ismerteti. A teszteseteket egy megnevezett osztályban határozzuk meg StudentTest.
Először be kell töltenünk egy Spring alkalmazás kontextust a fentiekből ServiceConfiguration konfigurációs osztály, és tárolja a kontextus terület:
privát ApplicationContext context = új AnnotationConfigApplicationContext (ClientConfiguration.class);
Ezután a szolgáltatás végpont interfészének proxyját deklaráljuk és töltjük be az alkalmazáskörnyezetből:
privát Baeldung baeldungProxy = (Baeldung) context.getBean ("kliens");
Ez Baeldung a proxyt az alábbiakban leírt tesztesetekben kell használni.
Az első tesztesetben bebizonyítjuk, hogy amikor a Helló metódust lokálisan meghívják a proxyn, a válasz pontosan megegyezik a végponttal megvalósító visszatér a távoli webszolgáltatásból:
@Test public void whenUsingHelloMethod_thenCorrect () {String response = baeldungProxy.hello ("John Doe"); assertEquals ("Hello John Doe!", válasz); }
A második tesztesetben a hallgatók regisztrálódnak a Baeldung tanfolyamokra azáltal, hogy helyileg meghívják a Regisztráció metódus a proxyn, amely viszont felhívja a webszolgáltatást. Ez a távoli szolgáltatás ezután kiszámítja a hallgatói számokat, és visszaadja azokat a hívónak. A következő kódrészlet megerősíti a várakozásokat:
@Test public void whenUsingRegisterMethod_thenCorrect () {Student student1 = new Student ("Adam"); Student student2 = new Student ("Éva"); Karakterlánc hallgató1Válasz = baeldungProxy.register (tanuló1); Karakterlánc student2Response = baeldungProxy.register (hallgató2); assertEquals ("Ádám regisztrált hallgatói száma 1", student1Response); assertEquals ("Éva be van jegyezve a 2. számú tanuló", student2Response); }
6. Integrációs tesztelés
Ahhoz, hogy webalkalmazásként telepíthető legyen a szerveren, az oktatóanyag kódrészleteit először WAR fájlba kell csomagolni. Ezt a csomagolás tulajdonság a POM fájlban:
háború
A csomagolási feladatot a Maven WAR plugin valósítja meg:
maven-war-plugin 2.6 hamis
Ez a bővítmény a lefordított forráskódot WAR fájlba csomagolja. Mivel a szervlet kontextust a Java kód használatával konfiguráljuk, a hagyományos web.xml a telepítési leírónak nem kell léteznie. Ennek eredményeként a failOnMissingWebXml tulajdonságot kell beállítani hamis a hiba elkerülése érdekében a plugin végrehajtásakor.
Ezt a linket követhetjük a Maven WAR plugin legújabb verziójához.
A webszolgáltatás működésének szemléltetése céljából létrehozunk egy integrációs tesztet. Ez a teszt először létrehoz egy WAR fájlt, elindít egy beágyazott szervert, majd az ügyfeleket felhívja a webszolgáltatásra, ellenőrzi a későbbi válaszokat és végül leállítja a szervert.
A következő bővítményeket kell beépíteni a Maven POM fájlba. További részletekért olvassa el ezt az integrációs tesztelési oktatóanyagot.
Itt van a Maven Surefire bővítmény:
maven-surefire-plugin 2.19.1 StudentTest.java
A bővítmény legújabb verziója itt található.
A profil szakasz a id nak,-nek integráció bejelentette, hogy megkönnyíti az integrációs tesztet:
integráció ...
A Maven Cargo plugint a integráció profil:
org.codehaus.cargo cargo-maven2-plugin 1.5.0 jetty9x beágyazott localhost 8080 start-server pre-integráció-teszt start stop-szerver post-integráció-teszt stop
Vegye figyelembe, hogy a cargo.hostname és cargo.servlet.port a konfigurációs tulajdonságok csupán az egyértelműség kedvéért szerepelnek benne. Ezek a konfigurációs tulajdonságok kihagyhatók az alkalmazásra gyakorolt hatás nélkül, mivel értékeik megegyeznek az alapértelmezett értékekkel. Ez a bővítmény elindítja a szervert, megvárja a kapcsolatokat, és végül leállítja a szervert a rendszererőforrások felszabadítása érdekében.
Ez a link lehetővé teszi számunkra, hogy megnézzük a Maven Cargo plugin legújabb verzióját.
A Maven Surefire bővítmény újra deklarálásra kerül, a integráció profil, hogy felülbírálja a konfigurációt épít szakaszban és az előző szakaszban leírt tesztesetek végrehajtására:
maven-surefire-plugin 2.19.1 integrációs teszt teszt nincs
Most a teljes folyamat a következő paranccsal futtatható: mvn -Pintegration tiszta telepítés.
7. Következtetés
Ez az oktatóanyag az Apache CXF támogatását illusztrálta a Spring számára. Különösen azt mutatták be, hogy miként lehet egy webes szolgáltatást közzétenni egy Spring konfigurációs fájl segítségével, és hogy az ügyfél hogyan léphet kapcsolatba a szolgáltatással egy Apache CXF proxy gyár által létrehozott proxyn keresztül, amelyet egy másik konfigurációs fájlban deklaráltak.
Mindezen példák és kódrészletek megvalósítása megtalálható a kapcsolt GitHub projektben.