JAX-WS è la specifica di JEE6 per la realizzazione di web-service in java. Essa definisce le annotazioni che possono essere utilizzate. Il JDK ne fornisce una implementazione in JAX-WS RI. JbossWS è l’implementazione di JAX-WS fornita dal container JBoss ed è spesso utilizzata quando si ha la necessità di supportare altri standard, come ad esempio WS-Security, WS-ReliableMessaging, etc. Apache CFX ne è una ulteriore implementazione.
Generazione della Web Application
L’approccio migliore per creare una nuova applicazione che fornisce dei servizi web (SOAP) con JAX-WS per il container JBoss è quello di utilizzare Maven e l’archetype jaxws-codefirst fornito da JBossWS. Allo scopo portiamoci quindi nella cartella dove intendiamo creare il nostro progetto ed eseguiamo il seguente comando Maven, avendo cura di modificare i parametri groupId
, artifactId
e package
a proprio piacimento:
1 2 3 4 5 6 7 8 |
mvn archetype:generate -DarchetypeArtifactId=jaxws-codefirst -DarchetypeGroupId=org.jboss.ws.plugins.archetypes -DinteractiveMode=false -DgroupId=it.javaboss -DartifactId=jaxws-webapp -Dpackage=it.javaboss.jaxws -DarchetypeVersion=1.2.0.Final |
Importiamo il progetto appena generato nel nostro IDE di riferimento (ad esempio Eclipse) ed ispezioniamo rapidamente il file pom.xml
. Nella sezione plugins
troviamo i seguenti plugin:
-
jaxws-tools-maven-
plugin
: utilizzato sia per la generazione del WSDL (wsprovider) che per la generazione dello stub client (wsconsume). -
maven-surefire-
plugin
: utilizzato per l’esecuzione dei test distinguendo tra la fase di test unitario (unit-test), eseguita subito dopo la compilazione, e la fase di test di integrazione (integration-test), eseguita dopo che l’applicazione è stata deployata. -
maven-war-
plugin
: utilizzato per il packaging dell’applicativo in un archivio war.
L’Esempio HelloWorld
Il progetto così generato contiene un end-point webservice di esempio implementato nella classe HelloWorldImpl
che implementa l’interfaccia HelloWorld
ed espone due semplici servizi: sayHi
e greetings
.
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 |
@WebService(endpointInterface = "it.javaboss.jaxws.HelloWorld", targetNamespace = "http://hello.world.ns/", name = "HelloWorld", serviceName = "HelloWorldService", portName = "HelloWorldPort") @SOAPBinding(style = Style.DOCUMENT, use = Use.LITERAL) public class HelloWorldImpl implements HelloWorld { public String sayHi(String text) { System.out.println(text); return "Hello " + text; } public String greetings(Person person) { System.out.println(person); return "Greetings " + person.getName() + " " + person.getSurname(); } } |
Il riferimento alla classe HelloWorldImpl
è anche presente nella configurazione del plugin wsprovider del pom.xml
al fine di specificare per quale interfaccia generare il WSDL. Si noti comunque che tale documento è anche generato da JBoss a seguito del deploy dell’applicazione.
Per la compilazione ed il deploy del servizio è sufficiente eseguire i seguenti comandi maven:
- mvn clean compile
- mvn wildfly:deploy
Il primo esegue la compilazione del progetto utilizzando il plug-in maven-compiler-plugin
, mentre il secondo esegue il deploy su JBoss utilizzando il plug-in org.wildfly.plugins
, entrambi definiti nel pom.xml
. Ovviamente JBoss deve essere attivo per poter eseguire il tast di deploy.
Per verificare il corretto deploy del servizio è sufficiente aprire il browser ed inserire l’url http://localhost:8080/jaxws-webapp/HelloWorldService?wsdl. Alternativamente è possibile utilizzare il tool SoapUI creando un nuovo progetto SOAP associato all’url del WSDL. In figura è mostrato un esempio di chiamata al servizio greatings()
:
Codice Sorgente
Il codice sorgente dell’applicazione è disponibile qui jaxws-webapp.