Je comprends que votre problème se résume à comment appeler un service web SOAP (JAX-WS) à partir de Java et obtenir son objet de retour . Dans ce cas, vous avez deux approches possibles :
- Générer les classes Java par
wsimport
et les utiliser ; ou
- Créer un client SOAP qui :
- Sérialise les paramètres du service en XML ;
- appelle la méthode Web par une manipulation HTTP ; et
- Analyse la réponse XML retournée dans un objet.
Concernant la première approche (utilisant wsimport
) :
Je vois que vous avez déjà les classes d'affaires des services (entités ou autres), et c'est un fait que l'option 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, que dans ce scénario, vous ne pouvez que soit :
- Adapter (modifier) le
wsimport
pour que le code généré utilise votre les classes d'affaires (c'est difficile et cela n'en vaut pas la peine - n'oubliez pas qu'à chaque fois que la WSDL change, vous devrez régénérer et réadapter le code) ; ou
- Abandonnez et utilisez le
wsimport
classes générées. (Dans cette solution, votre code métier pourrait "utiliser" les classes générées comme un service d'une autre couche architecturale).
Concernant la deuxième approche (créer votre client SOAP personnalisé) :
Afin de mettre en œuvre la deuxième approche, vous devrez :
- Passez l'appel :
- Utilisez le cadre 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 par le biais de
java.net.HttpUrlconnection
(et quelques java.io
manipulation).
- Transformez les objets en XML et inversement :
- Utiliser un cadre OXM (Object to XML Mapping) tel que JAXB pour sérialiser/désérialiser le XML à partir de/vers des objets.
- Ou, si vous le devez, créez/analysez manuellement le XML (cela peut être la meilleure solution si l'objet reçu ne diffère que très peu de l'objet envoyé).
Création d'un client SOAP à l'aide de classic java.net.HttpUrlConnection
n'est pas si difficile (mais pas si simple non plus), et vous pouvez trouver en ce lien un très bon code de départ.
Je vous recommande d'utiliser le cadre SAAJ :
SOAP avec API de pièces jointes pour Java (SAAJ) est principalement utilisé pour traiter directement les messages de demande/réponse SOAP qui se produisent dans les coulisses de toute 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;
}
}
En ce qui concerne 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/ .
0 votes
Votre question est un peu floue. La méthode que vous voulez créer (1) récupère l'objet du service Web, (2) travaille un peu avec l'objet et (3) le renvoie au service Web. Est-ce bien cela ?
0 votes
Non, l'objet sera créé dans le client, il sera envoyé au ws dans l'appel, le ws va définir une variable, par exemple currentTime, faire un peu de logique d'entreprise comme le stocker dans un db, et puis renvoyer l'objet au client avec le currentTime maintenant défini. J'espère que je me suis un peu mieux expliqué. Merci.