Ich bin relativ neu in der Welt der Webservices und meine Forschung scheint mich mehr verwirrt als aufgeklärt zu haben. Mein Problem ist, dass ich eine Bibliothek (jar) erhalten habe, die ich mit einigen Webservice-Funktionen erweitern muss.
Diese Bibliothek wird für andere Entwickler freigegeben, und unter den Klassen im JAR befinden sich Klassen mit einer Methode, die einen Webservice aufruft (der im Wesentlichen ein Attribut der Klasse festlegt, eine Geschäftslogik ausführt, z. B. das Speichern des Objekts in einer Datenbank). usw. und sendet das Objekt mit diesen Änderungen zurück). Ich möchte den Aufruf dieses Dienstes so einfach wie möglich gestalten, hoffentlich so einfach, dass der Entwickler, der die Klasse verwendet, dies nur tun muss.
Car c = new Car("Blue");
c.webmethod();
Ich habe JAX-WS studiert, um es auf dem Server zu verwenden, aber es scheint mir, dass ich weder auf wsimport
dem Server noch wsimport
auf dem Client ein erstellen muss , da ich weiß, dass beide Klassen haben, brauche ich nur eine Interaktion zwischen Klassen sowohl auf dem Server als auch auf dem Client geteilt. Wie macht es Ihrer Meinung nach Sinn, den Webservice und den Aufruf in der Klasse durchzuführen?
Antworten:
Ich verstehe, dass Ihr Problem darin besteht, einen SOAP-Webdienst (JAX-WS) von Java aus aufzurufen und sein zurückgegebenes Objekt abzurufen . In diesem Fall haben Sie zwei mögliche Ansätze:
wsimport
und verwenden Sie sie. oderÜber den ersten Ansatz (mit
wsimport
):Ich sehe, dass Sie bereits über die Geschäftsklassen der Services (Entitäten oder andere) verfügen, und es ist eine Tatsache, dass die
wsimport
eine ganze Reihe neuer Klassen generiert (die irgendwie Duplikate der Klassen sind, die Sie bereits haben).Ich fürchte jedoch, in diesem Szenario können Sie nur eines von beiden:
wsimport
generierten Code an (bearbeiten Sie ihn) , damit er Ihre Geschäftsklassen verwendet (dies ist schwierig und irgendwie nicht wert - denken Sie daran, dass Sie den Code jedes Mal neu generieren und anpassen müssen, wenn sich die WSDL ändert). oderwsimport
generierten Klassen. (In dieser Lösung könnte Ihr Geschäftscode die generierten Klassen als Service von einer anderen Architekturebene "verwenden".)Informationen zum zweiten Ansatz (Erstellen Sie Ihren benutzerdefinierten SOAP-Client):
Um den zweiten Ansatz zu implementieren, müssen Sie:
java.net.HttpUrlconnection
(und einigejava.io
Handhabung) tun .Das Erstellen eines SOAP-Clients mit classic
java.net.HttpUrlConnection
ist nicht so schwierig (aber auch nicht so einfach), und Sie finden in diesem Link einen sehr guten Startcode.Ich empfehle Ihnen, das SAAJ-Framework zu verwenden:
Unten sehen Sie ein funktionierendes Beispiel (führen Sie es aus!) Eines SOAP-Webdienstaufrufs mit SAAJ. Es ruft diesen Webdienst auf .
Informationen zur Verwendung von JAXB zum Serialisieren / Deserialisieren sind sehr einfach zu finden. Sie können hier beginnen: http://www.mkyong.com/java/jaxb-hello-world-example/ .
quelle
<xsd:element name="Incident_Number" type="xsd:string"/>
. H. Wie Sie sehen können, ist das Element geschlossen und es werden keine Informationen vom WS generiert.GetInfoByCity
ist503Service Unavailable
, es scheint. :(Oder verwenden Sie einfach wsdl2java von Apache CXF , um Objekte zu generieren, die Sie verwenden können.
Es ist in dem Binärpaket enthalten, das Sie von der Website herunterladen können. Sie können einfach einen Befehl wie folgt ausführen:
Es nutzt die WSDL - Datei Objekte zu erzeugen, die Sie wie können diese (Objektnamen werden ebenfalls aus der WSDL - Datei gepackt, so deine anders ein wenig sein wird):
Es gibt sogar ein Maven-Plug-In, das die Quellen generiert: https://cxf.apache.org/docs/maven-cxf-codegen-plugin-wsdl-to-java.html
Hinweis: Wenn Sie Quellen mit CXF und IDEA generieren, sollten Sie sich Folgendes ansehen: https://stackoverflow.com/a/46812593/840315
quelle
Ich habe eine viel einfachere Alternative zum Generieren von Seifenmeldungen gefunden. Gegeben ein Personenobjekt:
Unten finden Sie einen einfachen Soap Message Generator:
Sie können verwenden durch:
quelle