Comment puis-je gérer la dissémination des messages SOAP dans Castor lorsque l'espace de nom est défini dans la balise d'opération?

StackOverflow https://stackoverflow.com/questions/626648

Question

Je développe un service Web basé sur Spring-WS, le premier contrat. Je compte sur Castor marshaling et je suis tombé sur le problème suivant.

Les demandes sont acceptées lorsque le " xmlns " L'espace de nom est défini dans la balise Envelope, tel que:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"
                      xmlns="http://www.mycompany.com/MyService/schemas">
  <soap:Header/>
  <soap:Body>
    <doPlaceHoldRequest>
      <hold>
        <accountInfo>
          <accountNumber>123456789</accountNumber>
        </accountInfo>
        <extended>false</extended>
        <afterHours>false</afterHours>
        <amountSavings>1.00</amountSavings>
        <amountChecking>0.00</amountChecking>
      </hold>
    </doPlaceHoldRequest>
  </soap:Body>
</soap:Envelope>

Cependant, les clients .NET et Java générés à partir du fichier .wsdl fourni par Spring-WS (généré à partir d'un fichier XSD) forment leurs demandes de la manière suivante:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/">
  <soap:Header/>
  <soap:Body>
    <doPlaceHoldRequest 
                xmlns="http://www.mycompany.com/MyService/schemas">
      <hold>
        <accountInfo>
          <accountNumber>123456789</accountNumber>
        </accountInfo>
        <extended>false</extended>
        <afterHours>false</afterHours>
        <amountSavings>1.00</amountSavings>
        <amountChecking>0.00</amountChecking>
      </hold>
    </doPlaceHoldRequest>
  </soap:Body>
</soap:Envelope>

Cela se traduit par une exception Unmarshalling Exception lancée par Castor. Comment faire en sorte que Castor reconnaisse la validité de ces messages? Mon WSDL (ou le XSD que j'avais l'habitude de générer automatiquement) est-il erroné?

Était-ce utile?

La solution

SI vous voyez ce blog, je pense que je n’irai jamais vers d’autres services Web :) http://springkbase.blogspot.com/2009/06/ spring-webservice-with-castor.html

Autres conseils

J'ai rencontré ce problème encore et encore avec mon premier service Web Spring-WS / Castor. Autant que je sache, quelque part sur la ligne, un composant extrait la charge utile sans tenir compte de l'espace de noms. En d'autres termes, un nœud tel que doPlaceHoldRequest devient la racine d'un document XML sans hériter de la déclaration d'espace de noms de niveau supérieur et, dans les deux cas précédents, conduit à un noeud qui est dans l'espace de noms souhaité, et un qui ne l'est pas - l'un valide donc bien votre schéma, l'autre pas.

La meilleure solution semble être de couvrir toutes les bases. Faites que votre XSD ait elementFormDefault = " qualifié " ;, pour exiger que tous vos éléments soient dans un espace de noms. Ensuite, spécifiez un préfixe ns-uri et un préfixe ns dans chaque élément de mappage de votre mappage Castor. Le résultat est un peu plus lourd, avec tous les préfixes d'espace de nom, mais il semble le rendre beaucoup moins fragile lorsqu'il s'agit de clients fainéants et du comportement non documenté dans les composants du serveur.

JAX-WS renvoie des listes vides , ce qui est un bon argument. aussi. org.springframework.ws.soap.server.endpoint.interceptor.PayloadValidatingInterceptor vaut la peine de valider les entrées et les sorties.

Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top