Apache CXF con POJO

In questo capitolo imparerai come sviluppare una semplice applicazione web che invia un messaggio di saluto all'utente. Un progetto di servizio Web utilizza il modello WSDL . Il CXF consente di nascondere questo modello WSDL fornendo un semplice frontend per mappare le API CXF di Apache al WSDL sottostante.

In questo progetto più semplice, l'interfaccia del servizio Web sarà esposta direttamente al client e il client utilizzerà le API CXF Apache native per chiamare il servizio Web.

Per prima cosa creeremo un servizio web. Ogni servizio ha un'interfaccia esposta al client. Possiamo scrivere questa interfaccia come una semplice interfaccia Apache CXF o come un documento WSDL. In questo approccio Apache CXF-First, esporremo il nostro servizio tramite un'interfaccia Apache CXF.

Sviluppo di servizi Web

Il servizio che creeremo sul web avrà un unico metodo web chiamato greetings. Il metodo richiede un filestringtipo di argomento in cui invieremo il nome dell'utente. Il servizio invierà un messaggio di saluto al chiamante con il nome utente ricevuto incluso nel messaggio.

Interfaccia del servizio Web

Per esporre l'interfaccia del nostro servizio web, creeremo un'interfaccia CXF di Apache come segue:

//HelloWorld.java
package com.tutorialspoint.cxf.pojo;
public interface HelloWorld {
   String greetings(String text);
}

L'interfaccia ha un solo metodo chiamato greetings. Il server implementerà questa interfaccia. Nella nostra banale applicazione, questa interfaccia è direttamente esposta al client. In genere, in un'applicazione del servizio Web, si utilizza WSDL per descrivere l'interfaccia del servizio Web. In questa semplice applicazione, forniremo questa interfaccia diretta allo sviluppatore del cliente. Il client chiamerebbe quindi ilgreetingsmessaggio sull'oggetto server. Quindi prima creiamo il servizio web.

Implementazione del servizio Web

Il HelloWorld l'interfaccia è implementata in HelloWorldImpl Classe CXF di Apache come mostrato di seguito -

//HelloWorldImpl.java
package com.tutorialspoint.cxf.pojo;
public class HelloWorldImpl implements HelloWorld {
   @Override
   public String greetings(String text) {
      return "Hi " + text;
   }
}

Il greetings metodo riceve un parametro di string tipo, lo aggiunge a un messaggio di saluto e restituisce la stringa risultante al chiamante.

Successivamente, scriviamo l'applicazione server per ospitare il file HelloWorld servizio.

Creazione del server

L'applicazione server è composta da due parti:

  • La prima parte crea una fabbrica per il nostro servizio web e

  • La seconda parte scrive a main metodo per istanziarlo.

Il server utilizza ServerFactoryBean classe fornita dalle librerie CXF per esporre il nostro HelloWorldinterfaccia ai client remoti. Quindi, per prima cosa istanziamo il fileServerFactoryBean class e quindi impostare le sue varie proprietà -

ServerFactoryBean factory = new ServerFactoryBean();

Impostiamo la classe di servizio da chiamare chiamando il setServiceClass metodo sul factory oggetto -

factory.setServiceClass(HelloWorld.class);

Abbiamo impostato l'URL per chiamare il nostro servizio chiamando la fabbrica setAddressmetodo. Tieni presente che il servizio verrà pubblicato a questo URL.

factory.setAddress("http://localhost:5000/Hello");

In questo caso, il servizio viene distribuito sul server incorporato e ascolterà la porta 5000. Puoi optare per qualsiasi numero di porta di tua scelta.

Prima di creare la fabbrica, è necessario comunicare alla fabbrica la nostra classe di implementazione del servizio. Questo viene fatto chiamando ilsetServiceBean metodo sul factory oggetto come mostrato qui -

factory.setServiceBean(new HelloWorldImpl());

Il bean di servizio è impostato sull'istanza della nostra classe di implementazione del servizio. Infine, creiamo la fabbrica chiamandolacreate metodo -

factory.create();

Ora, poiché abbiamo sviluppato la fabbrica per eseguire il nostro servizio web, scriveremo in seguito un file main metodo per istanziarlo e mantenerlo in esecuzione per un po 'di tempo.

Ora scrivi un file main metodo per istanziare il HelloServer classe come segue -

public static void main(String[] args) throws Exception {
   new HelloServer();
   System.out.println("Listening on port 5000 ...");
}

Una volta istanziato, il HelloServerla classe continuerà a funzionare indefinitamente. Per le distribuzioni di produzione, manterrai sicuramente il tuo server in esecuzione per sempre. Nella situazione attuale, chiuderemmo il server dopo un tempo predeterminato come segue:

Thread.sleep(5 * 60 * 1000);
System.out.println("Server exiting ...");
System.exit(0);

L'intero codice per HelloServer la classe è riportata di seguito -

//HelloServer.java
//HelloServer.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ServerFactoryBean;
public class HelloServer {
   protected HelloServer() throws Exception {
      ServerFactoryBean factory = new ServerFactoryBean();
      factory.setServiceClass(HelloWorld.class);
      factory.setAddress("http://localhost:5000/Hello");
      factory.setServiceBean(new HelloWorldImpl());
      factory.create();
   }
   public static void main(String[] args) throws Exception {
      new HelloServer();
      System.out.println("Listening on port 5000 ...");
      Thread.sleep(5 * 60 * 1000);
      System.out.println("Server exiting ...");
      System.exit(0);
   }
}

L'applicazione server che abbiamo creato utilizza ServerFactoryBeanclasse dalle librerie CXF. Ora dobbiamo includere queste librerie nel nostro progetto per compilare con successo il fileHelloServerclasse. Noi useremoMaven per impostare le dipendenze del progetto.

Impostazione del progetto Maven

Per creare un progetto Maven, digita il seguente comando nella finestra della riga di comando. Nota che l'abbiamo testato su una macchina Mac. Per le installazioni Windows e Linux, le istruzioni potrebbero differire in alcuni punti.

mvn archetype:generate

Quando vengono richieste le proprietà, immettere i seguenti valori:

Define value for property 'groupId': : com.tutorialspoint
Define value for property 'artifactId': : cxf-pojo
Define value for property 'version': 1.0-SNAPSHOT: : 1.0
Define value for property 'package': com.tutorialspoint: : com.tutorialspoint.cxf.pojo

Al completamento del comando maven, troverai la struttura di cartelle appropriata creata nella tua cartella corrente insieme al file pom.xml.

La struttura della directory generata è mostrata qui -

Aggiungerai le dipendenze CXF nel file pom.xmle copia anche i file CXF di Apache creati sopra nella cartella appropriata della struttura creata da Maven. Per tua pronta consultazione, abbiamo fornito di seguito il file pom.xml per il progetto che abbiamo creato sulla nostra macchina.

<?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-pojo</artifactId>
   <version>1.0</version>
   <packaging>jar</packaging>
   
   <profiles>
      <profile>
         <id>server</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.pojo.HelloServer
                           </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.pojo.HelloClient
                           </mainClass>
                        </configuration>
                     </execution>
                  </executions>
               </plugin>
            </plugins>
         </build>
      </profile>
   </profiles>

   <dependencies>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-features-logging</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </dependency>
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-frontend-simple</artifactId>
         <version>3.3.0</version>
         <type>jar</type>
      </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-frontend-jaxws</artifactId>
         <version>3.3.0</version>
      </dependency>
      <!-- Jetty is needed if you're using the CXFServlet -->
      <dependency>
         <groupId>org.apache.cxf</groupId>
         <artifactId>cxf-rt-transports-http-jetty</artifactId>
         <version>3.3.0</version>
      </dependency>
   </dependencies>
   <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>
</project>

Il pom.xml sopra può includere dipendenze aggiuntive che sono irrilevanti per questo progetto, ma sono necessarie per il nostro prossimo progetto in questo tutorial. Ad ogni modo, non vi è alcun danno in quanto tale nell'inclusione di dipendenze aggiuntive.

Struttura delle cartelle del progetto

La struttura delle cartelle del progetto sulla mia macchina dopo aver posizionato i file CXF di Apache del client e del server è mostrata di seguito per una rapida consultazione -

Server in esecuzione

Per creare il progetto, utilizza il seguente comando nella finestra della riga di comando:

mvn clean install

È possibile avviare il server utilizzando il seguente comando:

mvn -Pserver

Questo avvierà il server e vedrai il seguente prompt sulla console:

INFO: Creating Service {http://pojo.cxf.tutorialspoint.com/}HelloWorld from class com.tutorialspoint.cxf.pojo.HelloWorld
INFO: Setting the server's publish address to be http://localhost:5000/Hello
Listening on port 5000 ...

Ora, nella finestra del tuo browser specifica l'URL del nostro servizio pubblicato. Vedrai il seguente output:

Ciò conferma che il nostro servizio è in esecuzione sulla porta specificata su un localhost. Poiché non abbiamo specificato il filegreetings messaggio nella nostra chiamata, un messaggio di errore SOAP viene restituito al browser.

Puoi testare ulteriormente il tuo servizio web utilizzando un client SOAP di tua scelta. Qui abbiamo utilizzato Postman per testare il nostro server.

L'output è come mostrato qui -

Osservalo SOAP Requestè stato codificato a mano. Dopo aver pubblicato la richiesta, il server ha inviato un fileSOAP Response messaggio, visualizzato nella parte inferiore della schermata.

Da ciò, puoi capire che CXF mantiene l'uso dei protocolli SOAP sia per la richiesta che per la risposta, fornendo al contempo una visione unificata di una varietà di tecnologie web che esistono nel mondo di oggi. Ciò semplifica notevolmente lo sviluppo di applicazioni web.

Il nostro prossimo compito è creare un client che utilizzerà il servizio web che hai creato.

Creazione del cliente

Nell'applicazione server HelloWorldè l'interfaccia che espone il nostro servizio web. Il servizio web stesso fornisce solo un semplice messaggio di saluto al client. Di solito, l'interfaccia del servizio Web è esposta al mondo esterno utilizzando WSDL (Web Services Description Language). In questa banale applicazione, esporremo il nostro servizio web al client esponendo direttamente l'interfaccia del servizio e cioè il fileHelloWorld.class.

A tale scopo, CXF fornisce una classe factory chiamata ClientProxyFactoryBean che ci consente di collegarci all'interfaccia desiderata all'istanza di fabbrica creata.

Innanzitutto, creiamo un'istanza di factory bean come segue:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

Chiamiamo il file setAddresssull'istanza del bean factory per impostare l'URL mediante il quale è possibile richiamare il nostro servizio web. Nel nostro caso, useremo l'URL utilizzato durante la creazione del server nel nostro passaggio precedente -

factory.setAddress("http://localhost:5000/Hello");

Successivamente, chiamiamo il file create metodo sul factory istanza per collegare la nostra interfaccia di servizio HelloWorld.class ad esso.

HelloWorld helloServer = factory.create(HelloWorld.class);

Infine, chiamiamo il file greetings metodo per richiamare il servizio Web remoto.

System.out.println(helloServer.greetings(System.getProperty("user.name")));

Questo stamperebbe un messaggio di saluto sulla tua console.

L'intera fonte per l'applicazione client è mostrata di seguito:

//HelloClient.java
package com.tutorialspoint.cxf.pojo;
import org.apache.cxf.frontend.ClientProxyFactoryBean;
public class HelloClient {
   public static void main(String[] args) throws Exception {
      ClientProxyFactoryBean factory = new ClientProxyFactoryBean();
      factory.setAddress("http://localhost:5000/Hello");
      HelloWorld helloServer = factory.create(HelloWorld.class);
      System.out.println(helloServer.greetings(System.getProperty("user.name")));
   }
}

Client in esecuzione

Assicurati che il server sia ancora in esecuzione sulla tua macchina. In caso, se è scaduto, riavviare il server con il seguente comando:

mvn -Pserver

Vedrai il seguente messaggio sulla console:

Listening on port 5000 ...

Ora, prima che il server scada, che abbiamo impostato su 5 minuti, apri un'altra finestra della riga di comando e avvia il client con il seguente comando:

mvn -Pclient

Vedrai un messaggio simile al seguente sulla riga di comando:

Hi tutorialspoint

Nota che tutorialspointè il nostro nome utente. Riceverai un saluto con il tuo nome.

Nel prossimo capitolo impareremo come utilizzare CXF in un progetto JAX-WS (Apache CXF API per XML Web Services).