Heim > Java > javaLernprogramm > Ausführliche Erläuterung von Beispielen für die Java-Integration von CXF zur Vervollständigung der Webdienstentwicklung

Ausführliche Erläuterung von Beispielen für die Java-Integration von CXF zur Vervollständigung der Webdienstentwicklung

Y2J
Freigeben: 2017-05-12 09:54:51
Original
1845 Leute haben es durchsucht

In diesem Artikel wird hauptsächlich das Beispiel der CXF-Integration durch Spring Boot zur Entwicklung von Webdiensten vorgestellt. Der Herausgeber findet es recht gut, daher werde ich es jetzt mit Ihnen teilen und als Referenz verwenden. Folgen wir dem Herausgeber und werfen wir einen Blick darauf.

Vorwort

Apropos Webdienste: Restful ist in den letzten Jahren sehr beliebt geworden und hat die Tendenz, traditionelle Seife zu ersetzen Webdienste, aber es gibt einige einzigartige Funktionen. Oder relativ alte Systeme verwenden immer noch traditionelle Soap-Webdienste, wie z. B. Schnittstellen zur Abfrage von Bank- und Flugtickets.

Wir stoßen derzeit auf diese Situation. Wir müssen die von einem Drittanbieter bereitgestellte Soap-Webservice-Schnittstelle im System abfragen, was bedeutet, dass wir sie in das bestehende System integrieren müssen.

Die Spring-Integration von CXF ist ursprünglich sehr einfach, aber da ich Spring Boot verwende, möchte ich nicht die vorherige XML-Konfigurationsmethode verwenden. Kann sie also elegant gemäß dem Spring Boot-Stil integriert werden?

Die Antwort ist natürlich ja, aber es gibt fast keine Informationen darüber im Internet. Nach viel Mühe halte ich es für notwendig, es aufzuzeichnen, obwohl es sehr einfach erscheint.

Abhängigkeiten hinzufügen

Für Maven-Projekte besteht der erste Schritt darin, Abhängigkeiten hinzuzufügen. Zusätzlich zu den ursprünglichen Spring-Boot-Abhängigkeiten müssen Sie auch CXF-Abhängigkeiten hinzufügen:

<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-frontend-jaxws</artifactId>
  <version>3.1.6</version>
</dependency>
<dependency>
  <groupId>org.apache.cxf</groupId>
  <artifactId>cxf-rt-transports-http</artifactId>
  <version>3.1.6</version>
</dependency>
Nach dem Login kopieren

Geschäftscode schreiben

Hier nehmen wir die Abfrage von Benutzerinformationen als Beispiel und erstellen ein benutzerdefiniertes Benutzer-Objekt:

public class User implements Serializable {
  private static final long serialVersionUID = -5939599230753662529L;
  private Long       userId;
  private String      username;
  private String      email;
  private Date       gmtCreate;
  //getter setter ......
}
Nach dem Login kopieren

Als nächstes erstellen Sie eine Benutzeroberfläche für die Bereitstellung von Webdienstdiensten. Es gibt zwei Methoden getName und getUser, eine gibt einen normalen String und die andere ein benutzerdefiniertes Objekt zurück:

@WebService
public interface UserService {
  @WebMethod
  String getName(@WebParam(name = "userId") Long userId);
  @WebMethod
  User getUser(Long userId);
}
Nach dem Login kopieren

Ja, natürlich muss die Schnittstelle mit Geschäftscode implementiert werden. Hier führen wir nur eine einfache Demonstration durch:

public class UserServiceImpl implements UserService {
  private Map<Long, User> userMap = new HashMap<Long, User>();
  public UserServiceImpl() {
    User user = new User();
    user.setUserId(10001L);
    user.setUsername("liyd1");
    user.setEmail("liyd1@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10002L);
    user.setUsername("liyd2");
    user.setEmail("liyd2@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
    user = new User();
    user.setUserId(10003L);
    user.setUsername("liyd3");
    user.setEmail("liyd3@qq.com");
    user.setGmtCreate(new Date());
    userMap.put(user.getUserId(), user);
  }
  @Override
  public String getName(Long userId) {
    return "liyd-" + userId;
  }
  @Override
  public User getUser(Long userId) {
    return userMap.get(userId);
  }
}
Nach dem Login kopieren

Dienst veröffentlichen

Wir haben das Schreiben der Schnittstelle abgeschlossen und Geschäftscode sowie der Rest. Der nächste Schritt besteht darin, Dienste zu veröffentlichen, bei denen es sich um die Integration von Spring Boot und cxf handelt.

Tatsächlich ist die Integration der beiden sehr einfach und prägnanter als die vorherige XML-Methode:

@Configuration
public class CxfConfig {
  @Bean
  public ServletRegistrationBean dispatcherServlet() {
    return new ServletRegistrationBean(new CXFServlet(), "/soap/*");
  }
  @Bean(name = Bus.DEFAULT_BUS_ID)
  public SpringBus springBus() {
    return new SpringBus();
  }
  @Bean
  public UserService userService() {
    return new UserServiceImpl();
  }
  @Bean
  public Endpoint endpoint() {
    EndpointImpl endpoint = new EndpointImpl(springBus(), userService());
    endpoint.publish("/user");
    return endpoint;
  }
}
Nach dem Login kopieren

Sie können von der Konfiguration von cxf bis zur Veröffentlichung sehen Dienste, es erfordert nur ein oder zwei Zeilen Code, überraschend einfach, oder?

Zu diesem Zeitpunkt sind alle unsere Vorgänge abgeschlossen. Starten Sie Spring Boot und besuchen Sie localhost:8080/soap/user?wsdl

Sie können sehen, dass die relevanten WSDL-Beschreibungsinformationen ausgegeben werden, erklären Sie den Dienst wurde veröffentlicht.

Rufen Sie den Dienst auf

Wie wird der Webdienst aufgerufen? Wenn Sie beispielsweise einige Schnittstellen von Drittanbietern integrieren, wird er zuerst aufgerufen freigegeben?

Um den Soap-Webdienst aufzurufen, besteht die allgemeine Methode darin, Client-Code basierend auf WSDL zu generieren. Nach der Integration kann er wie der Aufruf einer lokalen Schnittstelle verwendet werden.

Aber mir persönlich gefällt diese Methode nicht besonders. Jede Schnittstelle muss einmal generiert werden, und es gibt eine Menge Code, was sich mühsam anfühlt.

Ich bevorzuge relativ die Methode zum Aufrufen des Methodennamens, die erfrischend und prägnant ist. Das Folgende ist der gesamte Code:

JaxWsDynamicClientFactory dcf = JaxWsDynamicClientFactory.newInstance();
Client client = dcf.createClient("http://localhost:8080/soap/user?wsdl");
Object[] objects = client.invoke("getUser", 10002L);
//输出调用结果
System.out.println(objects[0].getClass());
System.out.println(objects[0].toString());
Nach dem Login kopieren

Bei dieser Methode ist zu beachten, dass der Dienst Schnittstelle heißt Was zurückgegeben wird, ist ein benutzerdefiniertes Objekt, dann wird der Datentyp im Ergebnis Object[] zu diesem benutzerdefinierten Objekt (die Komponente generiert dieses Objekt automatisch für Sie),

aber Ihr local Diese Klasse ist möglicherweise nicht vorhanden, daher müssen Sie sie selbst konvertieren. Der einfachste Weg besteht darin, eine neue Klasse zu erstellen, die genau dem zurückgegebenen Ergebnis entspricht, und die Konvertierung zu erzwingen. Eine bessere Möglichkeit besteht natürlich darin, eine allgemeine Klasse zu kapseln . Dies ist nicht Gegenstand dieses Artikels und wird hier nicht ausführlich besprochen.

[Verwandte Empfehlungen]

1. Java Kostenloses Video-Tutorial

2. JAVA-Tutorial-Handbuch

3. Umfassende Analyse von Java-Annotationen

Das obige ist der detaillierte Inhalt vonAusführliche Erläuterung von Beispielen für die Java-Integration von CXF zur Vervollständigung der Webdienstentwicklung. Für weitere Informationen folgen Sie bitte anderen verwandten Artikeln auf der PHP chinesischen Website!

Verwandte Etiketten:
Quelle:php.cn
Erklärung dieser Website
Der Inhalt dieses Artikels wird freiwillig von Internetnutzern beigesteuert und das Urheberrecht liegt beim ursprünglichen Autor. Diese Website übernimmt keine entsprechende rechtliche Verantwortung. Wenn Sie Inhalte finden, bei denen der Verdacht eines Plagiats oder einer Rechtsverletzung besteht, wenden Sie sich bitte an admin@php.cn
Beliebte Tutorials
Mehr>
Neueste Downloads
Mehr>
Web-Effekte
Quellcode der Website
Website-Materialien
Frontend-Vorlage