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>
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 ...... }
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); }
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); } }
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; } }
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());
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
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!