Sprievodca Apache CXF s jarou

1. Prehľad

Tento výukový program sa zameriava na konfiguráciu a pomocou rámca Apache CXF spolu s Springom - buď s konfiguráciou Java alebo XML.

Je to druhý v rade na Apache CXF; prvý sa zameral na základy CXF ako implementácie štandardných API JAX-WS.

2. Maven závislosti

Podobne ako v predchádzajúcom tutoriáli je potrebné zahrnúť nasledujúce dve závislosti:

 org.apache.cxf cxf-rt-frontend-jaxws 3.1.6 org.apache.cxf cxf-rt-transports-http 3.1.6 

Najnovšie verzie artefaktov Apache CXF nájdete na serveri apache-cxf.

Na podporu jari sú navyše potrebné nasledujúce závislosti:

 org.springframework jarný kontext 4.3.1.RELEASE org.springframework jarný-webmvc 4.3.1.RELEASE 

Najnovšie verzie jarných artefaktov nájdete tu.

Nakoniec, pretože programovo nakonfigurujeme aplikáciu pomocou rozhrania Java Servlet 3.0+ API namiesto tradičného web.xml deskriptor nasadenia, budeme potrebovať artefakt uvedený nižšie:

 javax.servlet javax.servlet-api 3.1.0 

Tu nájdeme najnovšiu verziu Servlet API.

3. Súčasti na strane servera

Poďme sa teraz pozrieť na komponenty, ktoré musia byť prítomné na strane servera, aby bolo možné zverejniť koncový bod webovej služby.

3.1. WebApplicationInitilizer Rozhranie

The WebApplicationInitializer rozhranie je implementované na programové konfigurovanie ServletContext rozhranie pre aplikáciu. Ak je prítomný na triednej ceste, je to na začiatku metóda je automaticky vyvolaná kontajnerom servletu a potom ServletContext je inštancovaný a inicializovaný.

Tu je definovaná trieda na implementáciu WebApplicationInitializer rozhranie:

verejná trieda AppInitializer implementuje WebApplicationInitializer {@Override public void onStartup (ServletContext container) {// Implementácia metódy}}

The na začiatku() metóda sa implementuje pomocou útržkov kódu uvedených nižšie.

Najskôr sa vytvorí a nakonfiguruje kontext jarnej aplikácie na registráciu triedy obsahujúcej konfiguračné metadáta:

AnnotationConfigWebApplicationContext context = nový AnnotationConfigWebApplicationContext (); context.register (ServiceConfiguration.class);

The ServiceConfiguration trieda je anotovaná s @ Konfigurácia anotácia poskytujúca definície fazule. O tejto triede sa pojednáva v nasledujúcej pododdiele.

Nasledujúci úryvok zobrazuje, ako sa kontext jarnej aplikácie pridáva do kontextu servletu:

container.addListener (nový ContextLoaderListener (kontext));

The CXFServlet trieda, ktorú definuje Apache CXF, sa generuje a registruje na spracovanie prichádzajúcich požiadaviek:

ServletRegistration.Dynamic dispečer = container.addServlet ("dispečer", nový CXFServlet ());

Kontext aplikácie načíta prvky pružiny definované v konfiguračnom súbore. V tomto prípade je názov servletu cxf, preto kontext vyhľadáva tieto prvky v súbore s názvom cxf-servlet.xml predvolene.

Nakoniec je servlet CXF namapovaný na relatívnu adresu URL:

dispatcher.addMapping ("/ services");

3.2. Starý dobrý web.xml

Prípadne, ak chceme využiť (trochu staromódny) deskriptor nasadenia a nie WebApplicationInitilizer zodpovedajúce web.xml súbor by mal obsahovať nasledujúce definície servletu:

 cxf org.apache.cxf.transport.servlet.CXFServlet 1 cxf / services / * 

3.3. ServiceConfiguration Trieda

Poďme sa teraz pozrieť na konfiguráciu služby - najskôr základnú kostru, ktorá obsahuje definície beanov pre koncový bod webovej služby:

@Configuration verejná trieda ServiceConfiguration {// definície fazule}

Prvou požadovanou fazuľou je SpringBus - ktorý dodáva rozšírenia pre Apache CXF pre prácu s Spring Framework:

@Bean public SpringBus springBus () {vrátiť nový SpringBus (); }

An EnpointImpl fazuľa je tiež potrebné vytvoriť pomocou SpringBus bean a webová služba realizátor. Tento objekt typu bean sa používa na zverejnenie koncového bodu na danej adrese HTTP:

@Bean public Endpoint endpoint () {EndpointImpl endpoint = new EndpointImpl (springBus (), new BaeldungImpl ()); endpoint.publish ("// localhost: 8080 / services / baeldung"); koncový bod návratu; }

The BaeldungImpl triedy sa používa na implementáciu rozhrania webovej služby. Jeho definícia je uvedená v nasledujúcej pododdiele.

Prípadne môžeme tiež deklarovať koncový bod servera v konfiguračnom súbore XML. Konkrétne cxf-servlet.xml súbor nižšie pracuje s web.xml deskriptor nasadenia, ako bol definovaný v pododdiele 3.1, a popisuje úplne rovnaký koncový bod:

Upozorňujeme, že konfiguračný súbor XML je pomenovaný podľa názvu servletu definovaného v deskriptore nasadenia, ktorým je cxf.

3.4. Definície typov

Ďalej - tu je definícia realizátor ktorá už bola uvedená v predchádzajúcom pododdiele:

@WebService (endpointInterface = "com.baeldung.cxf.spring.Baeldung") verejná trieda BaeldungImpl implementuje Baeldung {private int counter; public String ahoj (názov reťazca) {return "Hello" + name + "!"; } verejný reťazcový register (študent) {counter ++; návrat student.getName () + "je zaregistrované číslo študenta" + počítadlo; }}

Táto trieda poskytuje implementáciu pre Baeldung rozhranie koncového bodu, ktoré Apache CXF zahrnie do zverejnených metadát WSDL:

@WebService verejné rozhranie Baeldung {String ahoj (názov reťazca); Reťazcový register (študent); }

Rozhranie koncového bodu aj realizátor využiť Študent triedy, ktorá je definovaná takto:

public class Student {private String name; // konštruktory, getre a setre}

4. Fazuľa na strane klienta

Aby sme mohli využiť jarný rámec, deklarujeme fazuľu v a @ Konfigurácia komentovaná trieda:

@Configuration verejná trieda ClientConfiguration {// definície fazule}

Fazuľa s menom zákazník je definovaný:

@Bean (name = "client") public Object generateProxy () {return proxyFactoryBean (). Create (); }

The zákazník bean predstavuje zástupcu pre Baeldung webová služba. Vytvára sa vyvolaním do vytvoriť metóda na a JaxWsProxyFactoryBean bean, továreň na vytváranie serverov JAX-WS.

The JaxWsProxyFactoryBean objekt je vytvorený a nakonfigurovaný nasledujúcou metódou:

@Bean public JaxWsProxyFactoryBean proxyFactoryBean () {JaxWsProxyFactoryBean proxyFactory = nový JaxWsProxyFactoryBean (); proxyFactory.setServiceClass (Baeldung.class); proxyFactory.setAddress ("// localhost: 8080 / services / baeldung"); vrátiť proxyFactory; }

Továreň serviceClass vlastnosť označuje rozhranie webovej služby, zatiaľ čo adresa property označuje URL adresu proxy na uskutočňovanie vzdialených volaní.

Aj v prípade jarných bôbov na strane klienta je možné vrátiť sa k konfiguračnému súboru XML. Nasledujúce prvky deklarujú rovnaké fazule ako tie, ktoré sme práve programovo nakonfigurovali vyššie:

5. Testovacie prípady

Táto časť popisuje testovacie prípady použité na ilustráciu podpory Apache CXF pre Spring. Testovacie prípady sú definované v triede s názvom StudentTest.

Najskôr je potrebné načítať kontext aplikácie Spring z vyššie uvedeného ServiceConfiguration konfiguračná trieda a uložiť ju do medzipamäte kontext lúka:

private ApplicationContext context = new AnnotationConfigApplicationContext (ClientConfiguration.class);

Ďalej je proxy pre rozhranie koncového bodu služby deklarovaný a načítaný z kontextu aplikácie:

private Baeldung baeldungProxy = (Baeldung) context.getBean ("klient");

Toto Baeldung proxy server sa použije v testovacích prípadoch popísaných nižšie.

V prvom testovacom prípade dokazujeme, že keď Ahoj metóda je lokálne vyvolaná na proxy serveri, odpoveď je úplne rovnaká ako koncový bod realizátor návraty zo vzdialenej webovej služby:

@Test public void whenUsingHelloMethod_thenCorrect () {String response = baeldungProxy.hello ("John Doe"); assertEquals („Ahoj John Doe!“, odpoveď); }

V druhom testovacom prípade sa študenti zaregistrujú na kurzy Baeldung lokálnym odvolaním sa na Registrovať metóda na serveri proxy, ktorý zase volá webovú službu. Táto vzdialená služba potom vypočíta čísla študentov a vráti ich volajúcemu. Nasledujúci úryvok kódu potvrdzuje, čo očakávame:

@Test public void whenUsingRegisterMethod_thenCorrect () {Student student1 = new Student ("Adam"); Študent student2 = nový Študent („Eva“); Reťazec student1Response = baeldungProxy.register (student1); Reťazec student2Response = baeldungProxy.register (student2); assertEquals ("Adam je registrovaný študent číslo 1", student1Response); assertEquals ("Eva je registrovaná študentka číslo 2", student2Response); }

6. Testovanie integrácie

Aby bolo možné nasadiť ako webovú aplikáciu na serveri, je potrebné najskôr zabaliť útržky kódu v tejto príručke do súboru WAR. To sa dá dosiahnuť vyhlásením balenie vlastnosť v súbore POM:

vojna

Baliaca úloha je implementovaná doplnkom Maven WAR:

 maven-war-plugin 2.6 false 

Tento doplnok balí kompilovaný zdrojový kód do súboru WAR. Pretože konfigurujeme kontext servletu pomocou kódu Java, je to tradičné web.xml deskriptor nasadenia nemusí existovať. Vo výsledku failOnMissingWebXml vlastnosť musí byť nastavená na nepravdivé aby sa zabránilo zlyhaniu pri spustení pluginu.

Tento odkaz môžeme sledovať pri najnovšej verzii pluginu Maven WAR.

Na ilustráciu fungovania webovej služby vytvoríme test integrácie. Tento test najskôr vygeneruje súbor WAR a spustí vložený server, potom prinúti klientov vyvolať webovú službu, overí následné odpovede a nakoniec zastaví server.

Do súboru Maven POM je potrebné zahrnúť nasledujúce doplnky. Ďalšie informácie nájdete v tomto výučbe testovania integrácie.

Tu je doplnok Maven Surefire:

 maven-surefire-plugin 2.19.1 StudentTest.java 

Najnovšiu verziu tohto pluginu nájdete tu.

A profilu časť s id z integrácia sa deklaruje na uľahčenie testu integrácie:

  integrácia ... 

Doplnok Maven Cargo je súčasťou integrácia profil:

 org.codehaus.cargo cargo-maven2-plugin 1.5.0 jetty9x vložený localhost 8080 štartovací server predintegračný test štart stop-server po integrácii-test stop 

Všimnite si, že cargo.hostname a cargo.servlet.port vlastnosti konfigurácie sú uvedené iba kvôli zrozumiteľnosti. Tieto vlastnosti konfigurácie môžu byť vynechané bez akéhokoľvek vplyvu na aplikáciu, pretože ich hodnoty sú rovnaké ako predvolené hodnoty. Tento doplnok spustí server, počká na pripojenia a nakoniec zastaví server, aby uvoľnil systémové prostriedky.

Tento odkaz nám umožňuje skontrolovať najnovšiu verziu doplnku Maven Cargo.

Plugin Maven Surefire je deklarovaný znova v rámci integrácia profil, prepísať jeho konfiguráciu v hlavnom stavať a vykonanie testovacích prípadov popísaných v predchádzajúcej časti:

 maven-surefire-plugin 2.19.1 test integrácie-test žiadny 

Teraz je možné celý proces spustiť príkazom: mvn - Čistá inštalácia integrácie.

7. Záver

Tento výukový program ilustroval podporu Apache CXF pre Spring. Ukázalo sa najmä, ako môže byť webová služba zverejnená pomocou konfiguračného súboru Spring a ako môže klient s touto službou interagovať prostredníctvom proxy vytvoreného továrňou proxy Apache CXF, ktorá bola deklarovaná v inom konfiguračnom súbore.

Implementáciu všetkých týchto príkladov a útržkov kódu nájdete v prepojenom projekte GitHub.


$config[zx-auto] not found$config[zx-overlay] not found