2009-12-17 3 views
1

Je construis un service web en Java à partir d'un fichier WSDL existant. L'outil wsimport a généré toutes les classes Java liées aux éléments dans le schéma du service. En particulier, la déclaration de défaut donne la classe suivante:Comment étendre une exception générée par wsimport annotée avec WebFault?

@javax.xml.ws.WebFault(name = "Fault", targetNamespace = "http://my.company.com/service-1") 
public class ServiceFault extends java.lang.Exception { 
    // constructors and faulInfo getter 
} 

J'aimerais maintenant d'étendre cette classe, donc je peux ajouter un comportement plus:

public class MyServiceFault extends ServiceFault { 
    // some behavior 
} 

Quand je jette maintenant des instances de MyServiceFault de Dans mon application, je m'attends à ce que ces erreurs soient correctement sérialisées en XML dans la réponse SOAP. Mais au lieu, je reçois quelque chose comme ceci:

<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/"> 
    <env:Header/> 
    <env:Body> 
    <env:Fault> 
     <faultcode>env:Server</faultcode> 
     <faultstring>Some fault string.</faultstring> 
    </env:Fault> 
    </env:Body> 
</env:Envelope> 

C'est, je suis complètement manque l'élément FaultInfo. Ma pile SOAP traite MyServiceFault comme toute autre exception, et non comme une exception représentant une défaillance dans le service.

J'ai d'abord pensé que c'était parce que l'annotation @WebFault n'était pas héritée par MyServiceFault, mais j'ai essayé de nouveau après avoir explicitement ajouté cette annotation, sans succès.

Une idée de ce que je fais mal ici?

Répondre

0

Pour ce que ça vaut, je l'ai implémenté de cette façon.

import javax.xml.ws.WebFault; 

@WebFault(name = "SomeException") 
public class SomeException extends Exception { 

    private FaultBean faultInfo; 

    public SomeException(String message, FaultBean faultInfo) { 
     super(message); 
     this.faultInfo = faultInfo; 
    } 

    public SomeException(String message, FaultBean faultInfo, 
      Throwable cause) { 
     super(message, cause); 
     this.faultInfo = faultInfo; 
    } 

    public FaultBean getFaultInfo() { 
     return faultInfo; 
    } 
} 

qui produit quelque chose comme:

<?xml version="1.0" ?> 
<S:Envelope xmlns:S="http://schemas.xmlsoap.org/soap/envelope/"> 
<S:Body> 
<S:Fault xmlns:ns4="http://www.w3.org/2003/05/soap-envelope"> 
<faultcode>S:Server</faultcode> 
<faultstring>SomeErrorString</faultstring> 
<detail> 
<ns2:SomeException xmlns:ns2="http://namespace/"> 
<message>SomeErrorMessage</message> 
</ns2:SomeException> 
</detail> 
</S:Fault> 
</S:Body> 
</S:Envelope> 
Questions connexes