2010-11-17 30 views
7

Je suis actuellement confronté à un problème avec les codes d'erreur et les messages utilisant Spring WS.Comment transformer des exceptions en codes retour en utilisant Spring-WS?

Nous utilisons Spring WS 2.0 avec une liaison JAXB2 et les annotations @Endpoint et @PayloadRoot pour plus de commodité.

point final Notre ressemble à ceci:

@Endpoint 
public class MyEndpoint() { 
    private static final String MY_NAMESPACE=...; 

    @PayloadRoot(namespace=MY_NAMESPACE, localPart="myPart") 
    public MyPartResponse handleMyPart(MyPart myPart) { 
     .... 
    } 
} 

Nous utilisons uniquement du savon comme enveloppe mince autour d'un message POX, défini par le XSD. Cela signifie également que nous utilisons des codes de retour et des messages au lieu de fautes.

Chaque réponse hérite de

<xs:complexType name="ResultBase"> 
    <xs:sequence> 
     <xs:element name="errorCode" type="tns:ErrorCode" /> 
     <xs:element name="errorMessage" type="xs:string" /> 
    </xs:sequence> 
</xs:complexType> 

et ajoute quelques détails en cas de succès, comme celui-ci:

<xs:element name="MySpecificResponse"> 
    <xs:complexType> 
     <xs:complexContent> 
      <xs:extension base="tns:ResultBase"> 
       <xs:sequence> 
        <xs:element name="mySpecificElement" type="tns:MySpecificType" /> 
       </xs:sequence> 
      </xs:extension> 
     </xs:complexContent> 
    </xs:complexType> 
</xs:element> 

Toutes les exceptions étant jetés dans la méthode handleMyPart peut être proprement cartographiés.

Cependant deux types d'erreurs restent uncaught et génèrent des défauts au lieu d'un message d'erreur clair:

  • XSD Validations erreurs
  • XML malformées Erreurs

A la fin de la journée, ce sont des problèmes qui concernent chaque service Web POX utilisant Spring WS. Comment devrait-on intercepter ces exceptions et cartographier ensuite sur un objet réponse? Rappelez-vous cependant: tous les objets de réponse sont légèrement différents car ils héritent tous du commun, mais y ajoutent un contenu optionnel unique.

+0

Je viens de soulever une demande de fonctionnalité sur le printemps-WS Jira: https://jira.springframework.org/browse/SWS-657 –

Répondre

4

Une approche qui a bien fonctionné pour moi est la suivante:

Pour les erreurs de validation XSD, étendre le AbstractValidatingInterceptor à fournir une gestion personnalisée des erreurs de validation XSD, et le définir comme le haricot validatingInterceptor dans le contexte du printemps.

Pour un fichier XML mal formé, étendez MessageDispatcherServlet. Substituez doService pour intercepter DomPoxMessageException et ajoutez votre propre traitement personnalisé lorsque vous interceptez cette exception. Définissez votre MessageDispatcherServlet personnalisé en tant que servlet spring-ws dans le fichier web.xml.

Je l'ai écrit avec des détails ad nauseam dans mon blog ici:

http://www.dev-garden.org/2011/09/03/handling-pox-errors-in-spring-ws-part-1/

-Larry