Je comprends que votre problème se résume à la façon d'appeler un service Web SOAP (JAX-WS) à partir de Java et d'obtenir son objet de retour . Dans ce cas, vous avez deux approches possibles:
- Générez les classes Java via
wsimport
et utilisez-les; ou
- Créez un client SOAP qui:
- Sérialise les paramètres du service en XML;
- Appelle la méthode Web via la manipulation HTTP; et
- Analyser la réponse XML renvoyée dans un objet.
À propos de la première approche (en utilisant wsimport
):
Je vois que vous avez déjà les services (entités ou autres) classes d'affaires, et c'est un fait que le wsimport
génère un tout nouvel ensemble de classes (qui sont en quelque sorte des doublons des classes que vous avez déjà).
J'ai peur, cependant, dans ce scénario, vous ne pouvez que:
- Adaptez (éditez) le
wsimport
code généré pour qu'il utilise votre classes métier (c'est difficile et ça ne vaut pas la peine - gardez à l'esprit que chaque fois que le WSDL change, vous devrez régénérer et réadapter le code); ou
- Abandonnez et utilisez les
wsimport
classes générées. (Dans cette solution, votre code métier pourrait "utiliser" les classes générées en tant que service d'une autre couche architecturale.)
À propos de la deuxième approche (créez votre client SOAP personnalisé):
Afin de mettre en œuvre la deuxième approche, vous devrez:
- Faire l'appel:
- Utilisez le framework SAAJ (SOAP with Attachments API for Java) (voir ci-dessous, il est livré avec Java SE 1.6 ou supérieur) pour effectuer les appels; ou
- Vous pouvez également le faire via
java.net.HttpUrlconnection
(et une certaine java.io
manipulation).
- Transformez les objets en et en retour depuis XML:
- Utilisez un framework OXM (Object to XML Mapping) tel que JAXB pour sérialiser / désérialiser le XML depuis / vers des objets
- Ou, si vous devez, créer / analyser manuellement le XML (cela peut être la meilleure solution si l'objet reçu n'est que légèrement différent de celui envoyé).
Créer un client SOAP avec classic java.net.HttpUrlConnection
n'est pas si difficile (mais pas si simple non plus), et vous pouvez trouver dans ce lien un très bon code de démarrage.
Je vous recommande d'utiliser le framework SAAJ:
L'API SOAP avec pièces jointes pour Java (SAAJ) est principalement utilisée pour traiter directement les messages de demande / réponse SOAP qui se produisent en arrière-plan dans n'importe quelle API de service Web. Il permet aux développeurs d'envoyer et de recevoir directement des messages soap au lieu d'utiliser JAX-WS.
Voir ci-dessous un exemple fonctionnel (exécutez-le!) D'un appel de service Web SOAP utilisant SAAJ. Il appelle ce service 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;
}
}
À propos de l'utilisation de JAXB pour la sérialisation / désérialisation, il est très facile de trouver des informations à ce sujet. Vous pouvez commencer ici: http://www.mkyong.com/java/jaxb-hello-world-example/ .