Rozumiem, że problem sprowadza się do tego, jak wywołać usługę sieciową SOAP (JAX-WS) z języka Java i uzyskać zwracający ją obiekt . W takim przypadku masz dwa możliwe podejścia:
- Wygeneruj klasy Java
wsimport
i używaj ich; lub
- Utwórz klienta SOAP, który:
- Serializuje parametry usługi do XML;
- Wywołuje metodę sieciową poprzez manipulację HTTP; i
- Przeanalizuj zwracającą odpowiedź XML z powrotem do obiektu.
O pierwszym podejściu (używając wsimport
):
Widzę, że masz już klasy biznesowe usług (podmiotów lub innych) i faktem jest, że wsimport
generują one zupełnie nowy zestaw klas (które są w pewnym sensie duplikatami klas, które już masz).
Obawiam się jednak, że w tym scenariuszu możesz tylko:
- Dostosuj (edytuj)
wsimport
wygenerowany kod, aby używał Twoich klas biznesowych (jest to trudne i jakoś nie warte - pamiętaj, że za każdym razem, gdy WSDL się zmieni, będziesz musiał ponownie wygenerować i ponownie dostosować kod); lub
- Zrezygnuj i korzystaj z
wsimport
wygenerowanych klas. (W tym rozwiązaniu kod biznesowy mógłby „używać” wygenerowanych klas jako usługi z innej warstwy architektonicznej).
O drugim podejściu (stwórz własnego klienta SOAP):
Aby wdrożyć drugie podejście, musisz:
- Zatelefonować:
- Użyj struktury SAAJ (SOAP with Attachments API for Java) (patrz poniżej, jest dostarczana z Java SE 1.6 lub nowszą) do wykonywania wywołań; lub
- Możesz to również zrobić przez
java.net.HttpUrlconnection
(i trochę java.io
obsługi).
- Zamień obiekty do i z powrotem z XML:
- Użyj struktury OXM (Object to XML Mapping), takiej jak JAXB, aby serializować / deserializować XML z / do obiektów
- Lub, jeśli musisz, ręcznie utwórz / przeanalizuj XML (może to być najlepsze rozwiązanie, jeśli otrzymany obiekt różni się tylko trochę od wysłanego).
Tworzenie klienta SOAP przy użyciu klasycznego java.net.HttpUrlConnection
nie jest takie trudne (ale też nie takie proste), a w tym linku można znaleźć bardzo dobry kod początkowy.
Polecam korzystanie z frameworka SAAJ:
SOAP with Attachments API for Java (SAAJ) jest używany głównie do bezpośredniego radzenia sobie z komunikatami SOAP Request / Response, które mają miejsce za kulisami w dowolnym interfejsie API usługi sieci Web. Umożliwia programistom bezpośrednie wysyłanie i odbieranie wiadomości mydlanych zamiast korzystania z JAX-WS.
Zobacz poniżej działający przykład (uruchom go!) Wywołania usługi WWW SOAP przy użyciu SAAJ. Nazywa tę usługę internetową .
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;
}
}
Informacje o używaniu JAXB do serializacji / deserializacji są bardzo łatwe do znalezienia. Możesz zacząć tutaj: http://www.mkyong.com/java/jaxb-hello-world-example/ .