Apache CXF con JAX-WS

In questa applicazione JAX-WS, useremo l'approccio Apache CXF-first come la precedente applicazione POJO. Quindi prima creeremo un'interfaccia per il nostro servizio web.

Dichiarazione dell'interfaccia del servizio

Come nel caso precedente, creeremo un servizio banale che ha un solo metodo di interfaccia chiamato saluti. Il codice per l'interfaccia di servizio è mostrato di seguito -

//HelloWorld.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.jws.WebService;

@WebService
public interface HelloWorld {
   String greetings(String text);
}

Annotiamo l'interfaccia con un file @WebServiceetichetta. Successivamente, implementeremo questa interfaccia.

Implementazione dell'interfaccia Web

L'implementazione dell'interfaccia web è mostrata qui -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.jaxws.helloworld;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String name) {
      return ("hi " + name);
   }
}

Il metodo dei saluti è annotato con @Overrideetichetta. Il metodo restituisce un messaggio "ciao" al chiamante.

Successivamente, scriveremo il codice per lo sviluppo del server.

Server di sviluppo

A differenza dell'applicazione POJO, ora disaccoppieremo l'interfaccia utilizzando la classe Endpoint fornita da CXF per pubblicare il nostro servizio. Questo viene fatto nelle seguenti due righe di codice:

HelloWorld implementor = new HelloWorldImpl();
Endpoint.publish(
   "http://localhost:9090/HelloServerPort",
   implementor,
   new LoggingFeature()
);

Il primo parametro del metodo di pubblicazione specifica l'URL in cui il nostro servizio sarà reso disponibile ai client. Il secondo parametro specifica la classe di implementazione per il nostro servizio. L'intero codice per il server è mostrato di seguito -

//Server.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.ws.Endpoint;
import org.apache.cxf.ext.logging.LoggingFeature;
public class Server {
   public static void main(String[] args) throws Exception {
      HelloWorld implementor = new HelloWorldImpl();
      Endpoint.publish("http://localhost:9090/HelloServerPort",
      implementor,
      new LoggingFeature());
      System.out.println("Server ready...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

Per distribuire il nostro server, dovrai apportare alcune modifiche al tuo progetto come elencato di seguito.

Distribuzione del server

Infine, per distribuire l'applicazione server, dovrai apportare un'altra modifica in pom.xml per configurare la tua applicazione come applicazione web. Il codice che devi aggiungere al tuo filepom.xml è dato di seguito -

<profiles>
   <profile>
      <id>server</id>
      <build>
         <defaultGoal>test</defaultGoal>
         <plugins>
            <plugin>
               <groupId>org.codehaus.mojo</groupId>
               <artifactId>exec-maven-plugin</artifactId>
               <version>1.6.0</version>
               <executions>
                  <execution>
                     <phase>test</phase>
                     <goals>
                        <goal>java</goal>
                     </goals>
                     <configuration>
                        <mainClass>
                           com.tutorialspoint.cxf.jaxws.helloworld.Server
                        </mainClass>
                     </configuration>
                  </execution>
               </executions>
            </plugin>
         </plugins>
      </build>
   </profile>
</profiles>

Prima di distribuire l'applicazione, è necessario aggiungere altri due file al progetto. Questi sono mostrati nello screenshot qui sotto:

Questi file sono file standard CXF che definiscono la mappatura per CXFServlet. Il codice all'interno diweb.xml file è mostrato qui per una rapida consultazione -

//Web.xml
<?xml version = "1.0" encoding = "UTF-8"??>
<web-app xmlns = "http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" version="2.5"
xsi:schemaLocation = "http://java.sun.com/xml/ns/javaee
http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd">
   <display-name>cxf</display-name>
   <servlet>
      <description>Apache CXF Endpoint</description>
      <display-name>cxf</display-name>
      <servlet-name>cxf</servlet-name>
      <servlet-class>
         org.apache.cxf.transport.servlet.CXFServlet
      </servlet-class>
      <load-on-startup>
         1
      </load-on-startup>
   </servlet>
   <servlet-mapping>
      <servlet-name>
         cxf
      </servlet-name>
      <url-pattern>
         /services/*
      </url-pattern>
   </servlet-mapping>
   <session-config>
      <session-timeout>60</session-timeout>
   </session-config>
</web-app>

Nel cxf-servlet.xml,dichiari le proprietà per l'endpoint del tuo servizio. Questo è mostrato nello snippet di codice di seguito:

<beans ...>
   <jaxws:endpoint xmlns:helloworld = "http://tutorialspoint.com/"
      id = "helloHTTP"
      address = "http://localhost:9090/HelloServerPort"
      serviceName = "helloworld:HelloServiceService"
      endpointName = "helloworld:HelloServicePort">
   </jaxws:endpoint>
</beans>

Qui definiamo l'id per il nostro endpoint di servizio, l'indirizzo su cui il servizio sarà disponibile, il nome del servizio e il nome dell'endpoint. Ora, hai imparato come il tuo servizio viene instradato ed elaborato da un servlet CXF.

The Final pom.xml

Il pom.xmlinclude alcune dipendenze in più. Piuttosto che descrivere tutte le dipendenze, abbiamo incluso la versione finale di pom.xml di seguito -

<?xml version = "1.0" encoding = "UTF-8"??>
<project xmlns = "http://maven.apache.org/POM/4.0.0"
   xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
   xsi:schemaLocation = "http://maven.apache.org/POM/4.0.0
   http://maven.apache.org/xsd/maven-4.0.0.xsd">
   <modelVersion>4.0.0</modelVersion>
   <groupId>com.tutorialspoint</groupId>
   <artifactId>cxf-jaxws</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   <properties>
      <project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
      <maven.compiler.source>1.8</maven.compiler.source>
      <maven.compiler.target>1.8</maven.compiler.target>
   </properties>
   <profiles>
      <profile>
         <id>server</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <version>1.6.0</version>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        </goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.cxf.jaxws.helloworld.Server
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
      <profile>
         <id>client</id>
         <build>
            <defaultGoal>test</defaultGoal>
            <plugins>
               <plugin>
                  <groupId>org.codehaus.mojo</groupId>
                  <artifactId>exec-maven-plugin</artifactId>
                  <executions>
                     <execution>
                        <phase>test</phase>
                        <goals>
                           <goal>java</goal>
                        <goals>
                        <configuration>
                           <mainClass>
                              com.tutorialspoint.cxf.jaxws.helloworld.Client
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>
   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>3.3.0</version>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
</project>

Si noti che include anche un profilo per la creazione del client che impareremo nelle sezioni successive di questo tutorial.

Esecuzione del servizio HelloWorld

Ora sei pronto per eseguire l'app Web. Nella finestra dei comandi, esegui lo script di compilazione utilizzando il seguente comando.

mvn clean install
mvn -Pserver

Vedrai il seguente messaggio sulla console:

INFO: Setting the server's publish address to be http://localhost:9090/HelloServerPort
Server ready…

Come in precedenza, puoi testare il server aprendo l'URL del server nel tuo browser.

Poiché non abbiamo specificato alcuna operazione, viene restituito al browser solo un messaggio di errore dalla nostra applicazione.

Ora prova ad aggiungere il file ?wsdl al tuo URL e vedrai il seguente output:

Quindi la nostra applicazione server funziona come previsto. È possibile utilizzare il client SOAP comePostman descritto in precedenza per testare ulteriormente il servizio.

Nella prossima sezione impareremo come scrivere un client che utilizza il nostro servizio.

Cliente in via di sviluppo

Scrivere il client in un'applicazione CXF è banale come scrivere un server. Ecco il codice completo per il client -

//Client.java
package com.tutorialspoint.cxf.jaxws.helloworld;
import javax.xml.namespace.QName;
import javax.xml.ws.Service;
import javax.xml.ws.soap.SOAPBinding;
public final class Client {
   private static final QName SERVICE_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorld");
   private static final QName PORT_NAME
   = new QName("http://helloworld.jaxws.cxf.tutorialspoint.com/",
   "HelloWorldPort");
   private Client() {
   }
   public static void main(String[] args) throws Exception {
      Service service = Service.create(SERVICE_NAME);
      System.out.println("service created");
      String endpointAddress = "http://localhost:9090/HelloServerPort";
      service.addPort(PORT_NAME, SOAPBinding.SOAP11HTTP_BINDING,
      endpointAddress);
      HelloWorld hw = service.getPort(HelloWorld.class);
      System.out.println(hw.greetings("World"));
   }
}

Qui, usiamo il CXF fornito Serviceclasse da associare al servizio noto. Chiamiamo il filecreate metodo sul Serviceclass per ottenere un'istanza del servizio. Impostiamo la porta nota chiamando iladdPort metodo sul service esempio.

Ora siamo pronti per utilizzare il servizio, cosa che facciamo ottenendo prima l'interfaccia del servizio chiamando il getPort metodo sul serviceesempio. Infine, chiamiamo nostrogreetings metodo per stampare il messaggio di saluto sulla console.

Dopo aver appreso le basi di CXF utilizzando l'approccio Apache CXF-First, imparerai ora come utilizzare CXF con l'approccio WSDL-First nel prossimo capitolo.