Apache CXF mit POJO

In diesem Kapitel erfahren Sie, wie Sie eine einfache Webanwendung entwickeln, die eine Begrüßungsnachricht an den Benutzer sendet. Ein Webdienstprojekt verwendet das WSDL- Modell. Mit CXF können Sie dieses WSDL-Modell ausblenden, indem Sie ein einfaches Frontend bereitstellen, um Apache CXF-APIs der zugrunde liegenden WSDL zuzuordnen.

In diesem einfachsten Projekt wird die Schnittstelle des Webdienstes direkt für den Client verfügbar gemacht, und der Client verwendet native Apache CXF-APIs, um den Webdienst aufzurufen.

Zunächst erstellen wir einen Webdienst. Jeder Dienst verfügt über eine Schnittstelle, die für den Client verfügbar ist. Wir können diese Schnittstelle als einfache Apache CXF-Schnittstelle oder als WSDL-Dokument schreiben. In diesem Apache CXF-First-Ansatz werden wir unseren Service über eine Apache CXF-Schnittstelle verfügbar machen.

Webdienst entwickeln

Der Dienst, den wir im Web erstellen, hat eine einzige Webmethode namens greetings. Die Methode dauert astringTyp Argument, in dem wir den Namen des Benutzers senden. Der Dienst sendet eine Begrüßungsnachricht mit dem in der Nachricht enthaltenen empfangenen Benutzernamen an den Anrufer zurück.

Webdienstschnittstelle

Um die Schnittstelle unseres Webdienstes verfügbar zu machen, erstellen wir eine Apache CXF-Schnittstelle wie folgt:

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

Die Schnittstelle hat nur eine Methode aufgerufen greetings. Der Server implementiert diese Schnittstelle. In unserer einfachen Anwendung ist diese Schnittstelle direkt für den Client verfügbar. In einer Webdienstanwendung verwenden Sie normalerweise WSDL, um die Webdienstschnittstelle zu beschreiben. In dieser einfachen Anwendung stellen wir diese direkte Schnittstelle dem Client-Entwickler zur Verfügung. Der Client würde dann die anrufengreetingsNachricht auf dem Serverobjekt. Lassen Sie uns zuerst den Webdienst erstellen.

Implementierung des Webdienstes

Das HelloWorld Schnittstelle ist in der implementiert HelloWorldImpl Apache CXF-Klasse wie unten gezeigt -

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

Das greetings Methode erhält einen Parameter von string Geben Sie ein, hängen Sie es an eine Begrüßungsnachricht an und geben Sie die resultierende Zeichenfolge an den Anrufer zurück.

Als nächstes schreiben wir die Serveranwendung, um die zu hosten HelloWorld Bedienung.

Server erstellen

Die Serveranwendung besteht aus zwei Teilen -

  • Der erste Teil erstellt eine Fabrik für unseren Webservice und

  • Der zweite Teil schreibt a main Methode zur Instanziierung.

Der Server verwendet ServerFactoryBean Klasse von CXF-Bibliotheken zur Verfügung gestellt, um unsere HelloWorldSchnittstelle zu Remote-Clients. Daher instanziieren wir zuerst dieServerFactoryBean Klasse und setzen dann seine verschiedenen Eigenschaften -

ServerFactoryBean factory = new ServerFactoryBean();

Wir setzen die aufzurufende Serviceklasse durch Aufrufen von setServiceClass Methode auf der factory Objekt -

factory.setServiceClass(HelloWorld.class);

Wir legen die URL für den Anruf unseres Dienstes fest, indem wir die Fabrik anrufen setAddressMethode. Beachten Sie, dass der Dienst unter dieser URL veröffentlicht wird.

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

In diesem Fall wird der Dienst auf dem eingebetteten Server bereitgestellt und überwacht Port 5000. Sie können eine beliebige Portnummer Ihrer Wahl wählen.

Bevor Sie die Factory erstellen, müssen Sie die Factory über unsere Service-Implementierungsklasse informieren. Dies geschieht durch Aufrufen dersetServiceBean Methode auf der factory Objekt wie hier gezeigt -

factory.setServiceBean(new HelloWorldImpl());

Die Service-Bean wird auf die Instanz unserer Service-Implementierungsklasse gesetzt. Schließlich erstellen wir die Fabrik, indem wir ihre aufrufencreate Methode -

factory.create();

Jetzt, da wir die Fabrik für den Betrieb unseres Webdienstes entwickelt haben, werden wir als nächstes eine schreiben main Methode, um es zu instanziieren und für einige Zeit am Laufen zu halten.

Schreiben Sie jetzt eine main Methode zur Instanziierung der HelloServer Klasse wie folgt -

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

Einmal instanziiert, die HelloServerDie Klasse läuft auf unbestimmte Zeit weiter. Bei Produktionsbereitstellungen wird Ihr Server auf jeden Fall für immer laufen. In der aktuellen Situation würden wir den Server nach einer festgelegten Zeit wie folgt beenden:

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

Der gesamte Code für die HelloServer Klasse ist unten angegeben -

//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);
   }
}

Die von uns erstellte Serveranwendung wird verwendet ServerFactoryBeanKlasse aus CXF-Bibliotheken. Wir müssen diese Bibliotheken jetzt in unser Projekt aufnehmen, um die erfolgreich zu kompilierenHelloServerKlasse. Wir werden verwendenMaven um die Projektabhängigkeiten einzurichten.

Maven-Projekt einrichten

Geben Sie zum Erstellen eines Maven-Projekts den folgenden Befehl in Ihr Befehlszeilenfenster ein. Beachten Sie, dass wir dies auf einem Mac-Computer getestet haben. Bei Windows- und Linux-Installationen können die Anweisungen an einigen Stellen abweichen.

mvn archetype:generate

Wenn Sie nach den Eigenschaften gefragt werden, geben Sie die folgenden Werte ein:

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

Nach Abschluss des Befehls maven finden Sie die entsprechende Ordnerstruktur, die in Ihrem aktuellen Ordner zusammen mit der Datei pom.xml erstellt wurde.

Die generierte Verzeichnisstruktur wird hier angezeigt -

Sie fügen die CXF-Abhängigkeiten in die pom.xmlKopieren Sie außerdem die oben erstellten Apache CXF-Dateien in den entsprechenden Ordner der von Maven erstellten Struktur. Als Referenz haben wir unten die Datei pom.xml für das Projekt angegeben, das wir auf unserem Computer erstellt haben.

<?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>

Die obige pom.xml enthält möglicherweise zusätzliche Abhängigkeiten, die für dieses Projekt nicht relevant sind, aber für unser nächstes Projekt in diesem Lernprogramm erforderlich sind. Auf jeden Fall schadet es nicht, zusätzliche Abhängigkeiten aufzunehmen.

Projektordnerstruktur

Die Projektordnerstruktur auf meinem Computer nach dem Platzieren der Apache CXF-Dateien für Server und Client wird unten als Kurzreferenz angezeigt.

Server ausführen

Verwenden Sie zum Erstellen des Projekts den folgenden Befehl in Ihrem Befehlszeilenfenster:

mvn clean install

Sie können den Server mit dem folgenden Befehl starten:

mvn -Pserver

Dadurch wird der Server gestartet und auf der Konsole wird die folgende Eingabeaufforderung angezeigt:

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 ...

Geben Sie nun in Ihrem Browserfenster die URL unseres veröffentlichten Dienstes an. Sie sehen die folgende Ausgabe -

Dies bestätigt, dass unser Dienst am angegebenen Port auf einem lokalen Host ausgeführt wird. Da haben wir das nicht angegebengreetings Nachricht in unserem Anruf wird eine SOAP-Fehlermeldung an den Browser zurückgegeben.

Sie können Ihren Webdienst mit einem SOAP-Client Ihrer Wahl weiter testen. Hier haben wir Postman verwendet , um unseren Server zu testen.

Die Ausgabe ist wie hier gezeigt -

Beachten Sie das SOAP Requestwurde handcodiert. Nach dem Absenden der Anfrage hat der Server eine gesendetSOAP Response Nachricht, die im unteren Teil des Screenshots angezeigt wird.

Daraus können Sie ersehen, dass CXF die Verwendung von SOAP-Protokollen sowohl für Anforderungen als auch für Antworten beibehält und Ihnen gleichzeitig einen einheitlichen Überblick über eine Vielzahl von Webtechnologien bietet, die in der heutigen Welt existieren. Dies vereinfacht die Entwicklung von Webanwendungen erheblich.

Unsere nächste Aufgabe besteht darin, einen Client zu erstellen, der den von Ihnen erstellten Webdienst verwendet.

Client erstellen

In der Serveranwendung HelloWorldist die Schnittstelle, die unseren Webdienst verfügbar macht. Der Webdienst selbst stellt dem Client lediglich eine einfache Begrüßungsnachricht zur Verfügung. Normalerweise wird die Webdienstschnittstelle mithilfe von WSDL (Web Services Description Language) der Außenwelt ausgesetzt. In dieser trivialen Anwendung stellen wir unseren Webdienst dem Client zur Verfügung, indem wir die Dienstschnittstelle direkt verfügbar machenHelloWorld.class.

Zu diesem Zweck stellt CXF eine Factory-Klasse mit dem Namen bereit ClientProxyFactoryBean Dadurch können wir die gewünschte Schnittstelle an die erstellte Factory-Instanz anhängen.

Zuerst erstellen wir eine Factory-Bean-Instanz wie folgt:

ClientProxyFactoryBean factory = new ClientProxyFactoryBean();

Wir nennen das setAddressMethode auf der Factory-Bean-Instanz zum Festlegen der URL, über die unser Webdienst aufgerufen werden kann. In unserem Fall verwenden wir die URL, die beim Erstellen des Servers in unserem vorherigen Schritt verwendet wurde.

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

Als nächstes rufen wir die create Methode auf der factory Instanz zum Anhängen unserer Service-Schnittstelle HelloWorld.class dazu.

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

Schließlich nennen wir die greetings Methode zum Aufrufen des Remote-Webdienstes.

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

Dies würde eine Begrüßungsnachricht auf Ihrer Konsole drucken.

Die gesamte Quelle für die Clientanwendung wird unten angezeigt -

//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 ausführen

Stellen Sie sicher, dass der Server noch auf Ihrem Computer ausgeführt wird. Falls das Zeitlimit abgelaufen ist, starten Sie den Server mit dem folgenden Befehl neu:

mvn -Pserver

Auf der Konsole wird die folgende Meldung angezeigt:

Listening on port 5000 ...

Öffnen Sie nun vor Ablauf des Server-Timeouts, das wir auf 5 Minuten festgelegt haben, ein weiteres Befehlszeilenfenster und starten Sie den Client mit dem folgenden Befehl:

mvn -Pclient

In der Befehlszeile wird eine Meldung ähnlich der folgenden angezeigt:

Hi tutorialspoint

Beachten Sie, dass tutorialspointist unser Benutzername. Sie erhalten eine Begrüßung mit Ihrem eigenen Namen.

Im nächsten Kapitel erfahren Sie, wie Sie CXF in einem JAX-WS-Projekt (Apache CXF API für XML Web Services) verwenden.