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.

22
demandé sur adranale 2011-09-02 13:49:16

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

5
répondu BPS 2012-12-28 14:17:50

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

1
répondu Ren 2012-01-05 21:48:28

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 InputSourceapproprié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"));
0
répondu Ryan Ransford 2011-09-02 18:46:04

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.

0
répondu explorer 2011-09-19 17:20:12

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:

  1. extraire le schéma de votre wsdl,
  2. 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.

0
répondu Paperback Writer 2012-11-29 13:32:37

Essayez ceci

  1. utilisez le WSDL et créez un proxy JAX-RPC
  2. 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
  3. Dans le gestionnaire, essayez le code ci-dessous dans le public boolean handleRequest(MessageContext mc) ajouter ces lignes

    mc.setProperty("USE_TEST_FILE", <your response in .xml file>);
    return false;
    
  4. 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

0
répondu Srijit 2014-06-26 14:12:32

Validez par rapport au schéma d'enveloppeSOAP , puis extrayez le corps et les en-têtes et validez par rapport au schéma spécifique. Devrait être assez simple.

0
répondu ThomasRS 2016-10-29 21:42:07

Veuillez jeter un oeil à Apache AXIS2 API.

-3
répondu Prabath Siriwardena 2011-09-04 05:47:03