Java. Valider le message SOAP contre un WSDL
Je dois valider un message SOAP contre un WSDL
?
(de la même manière qu'un fichier XML
peut être validé par rapport à un schéma XSD
).
Je n'appelle aucun service web;
J'ai juste un message SOAP
et un WSDL
, et je dois vérifier que le message SOAP
est correct.
sans appeler le webservice ou quoi que ce soit par la suite.
Je dois le faire valider dans un programme Java. Connaissez-vous une petite bibliothèque Java pour le faire?
Ps: je suis conscient que plusieurs JAX-WS
les bibliothèques peuvent valider la requête/réponse lorsque vous appelez un service web. Mais encore une fois, je n'appelle aucun webservice; j'ai un simple message SOAP
, et un WSDL
, et j'ai besoin d'une fonction qui valide le message SOAP
contre le WSDL
.
Ps: je suis aussi conscient qu'il existe des outils qui peuvent le faire, comme SOAPUI
et XMLSpy
. Encore une fois, je dois faire cette validation dans mon programme Java.
Ps: je suis conscient que je pourrais extraire la partie du corps du message SOAP
, et le valider contre le XSD
. Cependant, je voudrais valider l'ensemble du message SOAP
par rapport au WSDL
.
8 réponses
Vous pouvez regarder le code source de la classe WsdlValidator dans le projet open-source soapUI.
Https://github.com/SmartBear/soapui
Http://www.soapui.org/apidocs/com/eviware/soapui/impl/wsdl/support/wsdl/WsdlValidator.html
Si vous créez un client webservice à l'aide d'un générateur de code basé sur Apache CXF ou Apache Axis 2 , Il y a de fortes Chances que votre code webservice fonctionne correctement tant que le fournisseur webservice et votre client sont dans la même version des normes SOAP/WS*.Sur la base de L'API que vous choisissez d'appeler le webservice, vous pouvez voir si la capacité de journalisation de cette API peut être utilisée pour imprimer la requête SOAP générée .
Une Autre approche pourrait être d'utiliser un outil comme SOAPUI. Vous pouvez essayer de configurer un service web simulé en utilisant L'interface utilisateur SOAP basée sur le WSDL que vous avez, puis appeler tester votre client webservice en appelant le service simulé . Voir le lien SOAP UI ici http://www.soapui.org/Getting-Started/web-service-sample-project/1-Web-Service-Mocking.html
Je pense que vous cherchez peut-être une réponse beaucoup trop complexe pour ce dont vous avez vraiment besoin. Tout ce que vous devez vraiment faire est d'avoir les documents DTD/XSD appropriés enregistrés afin que les classes JAXP normales puissent les référencer.
Ce code, de Sun / Oracle , implémente un EntityResolver
de base. Vous devez construire cette classe de manière à fournir au DocumentBuilder
les InputSource
appropriés pour le schéma défini dans les documents que vous essayez de valider.
import org.xml.sax.EntityResolver;
import org.xml.sax.InputSource;
public class MyResolver implements EntityResolver {
public InputSource resolveEntity (String publicId, String systemId) {
if (systemId.equals("http://www.myhost.com/today")) {
// return a special input source
MyReader reader = new MyReader();
return new InputSource(reader);
} else {
// use the default behaviour
return null;
}
}
}
En utilisant ce code, vous pouvez extraire votre EntityResolver
personnalisé et l'utiliser lors de l'analyse/validation du document.
final DocumentBuilderFactory dbf = DocumentBuilderFactory.newInstance();
dbf.setNamespaceAware = true;
dbf.setValidating = true;
final DocumentBuilder db = dbf.newDocumentBuilder();
final MyResolver r = MyResolver.newInstance();
db.setEntityResolver(r);
final Document docFromFile = db.parse("path/to/my/document.xml");
// or
final Document docFromStream = db.parse(new FileInputStream("blah"));
Vous pouvez créer un talon en utilisant le WSDL que vous avez, puis faire la requête au talon en utilisant votre requête XML. Si tout se passe correctement votre demande est correcte.
Vous pouvez importer le WSDL dans votre projet, puis faire un appel au service stub en utilisant votre XML. De cette façon, vous pouvez apporter des modifications aux validations sans aucune modification du code.
Comme le message SOAP est xml, vous pouvez valider le message entier par rapport à xsd. Par exemple, j'ai trouvé ce schéma pour le message SOAP. Vous pourriez:
- extraire le schéma de votre wsdl,
- validez le message par rapport au schéma du schéma WSDL et soap.
Si vous voulez valider par rapport à WSDL spécifique, vous pouvez préparer votre schéma à la main: il suffit de placer l'élément racine de votre message au lieu de cette partie:
<xs:sequence>
<xs:any namespace="##any" minOccurs="0" maxOccurs="unbounded" processContents="lax"/>
</xs:sequence>
Dans le schéma SOAP.
Essayez ceci
- utilisez le WSDL et créez un proxy JAX-RPC
- Créez un gestionnaire webservice JAX RPC et enregistrez-le dans la référence webservice Veuillez vous référer à ce lien pour voir comment créer des gestionnaires de service web
-
Dans le gestionnaire, essayez le code ci-dessous dans le
public boolean handleRequest(MessageContext mc)
ajouter ces lignesmc.setProperty("USE_TEST_FILE", <your response in .xml file>); return false;
-
Dans le
public boolean handleResponse(MessageContext mc)
String testFileName = (String) mc.getProperty("USE_TEST_FILE"); InputStream instream = <read file as an input stream> SOAPMessageContext smc = (SOAPMessageContext) mc; SOAPMessage message = smc.getMessage(); SOAPPart soapPart = message.getSOAPPart(); soapPart.setContent(new StreamSource(instream)); smc.setMessage(message); return false;
Exécutez maintenant votre proxy.. le proxy échouera si le message n'est pas valide par WSDL