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:
- Generieren Sie die Java-Klassen durch
wsimport
und verwenden Sie sie. oder
- Erstellen Sie einen SOAP-Client, der:
- Serialisiert die Parameter des Dienstes in XML.
- Ruft die Webmethode über HTTP-Manipulation auf. und
- Analysieren Sie die zurückgegebene XML-Antwort zurück in ein Objekt.
Ü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:
- Passen Sie den
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). oder
- Gib auf und benutze die
wsimport
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:
- Rufen Sie an:
- Verwenden Sie das SAAJ-Framework (SOAP mit Attachments API für Java) (siehe unten, es wird mit Java SE 1.6 oder höher geliefert), um die Anrufe zu tätigen. oder
- Sie können es auch durch
java.net.HttpUrlconnection
(und einige java.io
Handhabung) tun .
- Verwandeln Sie die Objekte in und aus XML:
- Verwenden Sie ein OXM-Framework (Object to XML Mapping) wie JAXB, um das XML von / in Objekte zu serialisieren / deserialisieren
- Wenn nötig, erstellen / analysieren Sie das XML manuell (dies kann die beste Lösung sein, wenn sich das empfangene Objekt nur geringfügig vom gesendeten unterscheidet).
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:
Die API für SOAP mit Anhängen für Java (SAAJ) wird hauptsächlich für den direkten Umgang mit SOAP-Anforderungs- / Antwortnachrichten verwendet, die in einer Webdienst-API hinter den Kulissen auftreten. Es ermöglicht den Entwicklern, Seifennachrichten direkt zu senden und zu empfangen, anstatt JAX-WS zu verwenden.
Unten sehen Sie ein funktionierendes Beispiel (führen Sie es aus!) Eines SOAP-Webdienstaufrufs mit SAAJ. Es ruft diesen Webdienst auf .
import javax.xml.soap.*;
public class SOAPClientSAAJ {
// SAAJ - SOAP Client Testing
public static void main(String args[]) {
/*
The example below requests from the Web Service at:
https://www.w3schools.com/xml/tempconvert.asmx?op=CelsiusToFahrenheit
To call other WS, change the parameters below, which are:
- the SOAP Endpoint URL (that is, where the service is responding from)
- the SOAP Action
Also change the contents of the method createSoapEnvelope() in this class. It constructs
the inner part of the SOAP envelope that is actually sent.
*/
String soapEndpointUrl = "https://www.w3schools.com/xml/tempconvert.asmx";
String soapAction = "https://www.w3schools.com/xml/CelsiusToFahrenheit";
callSoapWebService(soapEndpointUrl, soapAction);
}
private static void createSoapEnvelope(SOAPMessage soapMessage) throws SOAPException {
SOAPPart soapPart = soapMessage.getSOAPPart();
String myNamespace = "myNamespace";
String myNamespaceURI = "https://www.w3schools.com/xml/";
// SOAP Envelope
SOAPEnvelope envelope = soapPart.getEnvelope();
envelope.addNamespaceDeclaration(myNamespace, myNamespaceURI);
/*
Constructed SOAP Request Message:
<SOAP-ENV:Envelope xmlns:SOAP-ENV="http://schemas.xmlsoap.org/soap/envelope/" xmlns:myNamespace="https://www.w3schools.com/xml/">
<SOAP-ENV:Header/>
<SOAP-ENV:Body>
<myNamespace:CelsiusToFahrenheit>
<myNamespace:Celsius>100</myNamespace:Celsius>
</myNamespace:CelsiusToFahrenheit>
</SOAP-ENV:Body>
</SOAP-ENV:Envelope>
*/
// SOAP Body
SOAPBody soapBody = envelope.getBody();
SOAPElement soapBodyElem = soapBody.addChildElement("CelsiusToFahrenheit", myNamespace);
SOAPElement soapBodyElem1 = soapBodyElem.addChildElement("Celsius", myNamespace);
soapBodyElem1.addTextNode("100");
}
private static void callSoapWebService(String soapEndpointUrl, String soapAction) {
try {
// Create SOAP Connection
SOAPConnectionFactory soapConnectionFactory = SOAPConnectionFactory.newInstance();
SOAPConnection soapConnection = soapConnectionFactory.createConnection();
// Send SOAP Message to SOAP Server
SOAPMessage soapResponse = soapConnection.call(createSOAPRequest(soapAction), soapEndpointUrl);
// Print the SOAP Response
System.out.println("Response SOAP Message:");
soapResponse.writeTo(System.out);
System.out.println();
soapConnection.close();
} catch (Exception e) {
System.err.println("\nError occurred while sending SOAP Request to Server!\nMake sure you have the correct endpoint URL and SOAPAction!\n");
e.printStackTrace();
}
}
private static SOAPMessage createSOAPRequest(String soapAction) throws Exception {
MessageFactory messageFactory = MessageFactory.newInstance();
SOAPMessage soapMessage = messageFactory.createMessage();
createSoapEnvelope(soapMessage);
MimeHeaders headers = soapMessage.getMimeHeaders();
headers.addHeader("SOAPAction", soapAction);
soapMessage.saveChanges();
/* Print the request message, just for debugging purposes */
System.out.println("Request SOAP Message:");
soapMessage.writeTo(System.out);
System.out.println("\n");
return soapMessage;
}
}
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/ .