Capisco che il tuo problema si riduce a come chiamare un servizio web SOAP (JAX-WS) da Java e ottenere il suo oggetto restituito . In tal caso, hai due possibili approcci:
- Genera le classi Java tramite
wsimport
e usale; o
- Crea un client SOAP che:
- Serializza i parametri del servizio in XML;
- Chiama il metodo web tramite la manipolazione HTTP; e
- Analizza la risposta XML restituita in un oggetto.
Informazioni sul primo approccio (utilizzando wsimport
):
Vedo che hai già le classi di business dei servizi (entità o altro), ed è un dato di fatto che wsimport
genera un intero nuovo insieme di classi (che sono in qualche modo duplicati delle classi che già hai).
Temo, tuttavia, in questo scenario, puoi solo:
- Adatta (modifica) il
wsimport
codice generato per far sì che utilizzi le tue classi di business (questo è difficile e in qualche modo non ne vale la pena - tieni presente che ogni volta che il WSDL cambia, dovrai rigenerare e riadattare il codice); o
- Abbandona e usa le
wsimport
classi generate. (In questa soluzione, il codice aziendale potrebbe "utilizzare" le classi generate come un servizio da un altro livello di architettura.)
Informazioni sul secondo approccio (crea il tuo client SOAP personalizzato):
Per implementare il secondo approccio, dovrai:
- Effettua la chiamata:
- Utilizza il framework SAAJ (SOAP with Attachments API for Java) (vedi sotto, viene fornito con Java SE 1.6 o successivo) per effettuare le chiamate; o
- Puoi anche farlo attraverso
java.net.HttpUrlconnection
(e un po 'di java.io
manipolazione).
- Trasforma gli oggetti in e viceversa da XML:
- Utilizza un framework OXM (Object to XML Mapping) come JAXB per serializzare / deserializzare l'XML da / in oggetti
- Oppure, se necessario, creare / analizzare manualmente l'XML (questa può essere la soluzione migliore se l'oggetto ricevuto è solo leggermente diverso da quello inviato).
Creare un client SOAP usando il classico java.net.HttpUrlConnection
non è così difficile (ma nemmeno così semplice), e puoi trovare in questo link un ottimo codice di partenza.
Ti consiglio di utilizzare il framework SAAJ:
SOAP con allegati API per Java (SAAJ) viene utilizzato principalmente per gestire direttamente i messaggi di richiesta / risposta SOAP che avvengono dietro le quinte in qualsiasi API del servizio Web. Consente agli sviluppatori di inviare e ricevere direttamente messaggi soap invece di utilizzare JAX-WS.
Vedi sotto un esempio funzionante (eseguilo!) Di una chiamata al servizio web SOAP utilizzando SAAJ. Chiama questo servizio web .
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;
}
}
Informazioni sull'utilizzo di JAXB per la serializzazione / deserializzazione, è molto facile trovare informazioni su di esso. Puoi iniziare qui: http://www.mkyong.com/java/jaxb-hello-world-example/ .