Hiérarchie des exceptions vérifiées dans webservices à l'aide du plugin JAX-WS Maven (WSIMPORT)

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

Question

Je travaille sur un projet où nous voulons utiliser des exceptions vérifiées pour informer l'utilisateur de (par exemple) une mauvaise entrée ou une mauvaise action prise. De telles exceptions devraient avoir une hiérarchie telle que:

public abstract class BusinessException extends java.lang.Exception {...}
public class InvalidInputException extends BusinessException {...}
public class InvalidActionException extends BusinessException {...}

Nous générons du code Java à partir de WSDL / XSD (approche contractuelle-première) à l'aide de maven, jaxws-maven-plugin, objectif wsimport.

J'ai essayé de suivre ça ( http://www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html ) Tutoriel (c'est pour JAX-RPC, mais semble fonctionner également pour JAX-WS). J'ai écrit

<definitions ...>

    <message name="empty"/>
    <message name="ExceptionMessage">
        <part name="fault" element="ows:ValidationException"/>
    </message>

    <portType name="TestWebService">
        <operation name="throwException">
            <input message="tns:empty"/>
            <output message="tns:empty"/>
            <fault name="fault" message="tns:ExceptionMessage"/>
        </operation>
    </portType>

    <binding name="TestWebServicePortBinding"
             type="tns:TestWebService">
        <soap:binding transport="http://schemas.xmlsoap.org/soap/http"
                      style="document"/>


        <operation name="throwException">
            <input>
                <soap:body use="literal"/>
            </input>
            <output>
                <soap:body use="literal"/>
            </output>
            <fault name="fault">
                <soap:fault name="fault" use="literal"/>
            </fault>
        </operation>
    </binding>

  ...
</definitions>

avec des types définis dans OWS: Espace de noms

<xs:complexType name="BusinessException" abstract="true">
    <xs:sequence>
        <xs:element name="code" type="xs:int"/>
    </xs:sequence>
</xs:complexType>

<xs:complexType name="InvalidInputException">
    <xs:complexContent>
        <xs:extension base="tns:BusinessException">
            <xs:sequence>
                <xs:element name="validationMessage" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:complexType name="InvalidActionException">
    <xs:complexContent>
        <xs:extension base="tns:BusinessException">
            <xs:sequence>
                <xs:element name="actionName" type="xs:string"/>
            </xs:sequence>
        </xs:extension>
    </xs:complexContent>
</xs:complexType>

<xs:element name="ValidationException" type="tns:InvalidInputException"/>

Quand je cours mvn clean package, je reçois ce qui suit (Getters, Setters, CTORS et Annotations supprimés):

public interface TestWebService {
    @WebMethod
    public void throwException() throws ExceptionMessage;
}

public class ExceptionMessage extends Exception {
    private InvalidInputException faultInfo;
    (...)
}

public abstract class BusinessException implements Serializable {
    protected int code;
    (...)
}  

public class InvalidActionException extends BusinessException implements Serializable {
    protected String actionName;
    (...)
}

public class InvalidInputException extends BusinessException implements Serializable {
    protected String validationMessage;
    (...)
}

Ce qui n'est pas ce que je voulais, car il y a une exception et il peut tenir différent faultInto Les données. Existe-t-il un moyen de créer une hiérarchie d'exception comme indiqué ci-dessus uniquement dans XSD / WSDL? Comme le ExceptionMessage La classe est générée directement à partir de <message> Tag, je n'ai pas pu trouver un moyen de créer un parent / enfant là-bas.

Était-ce utile?

La solution 2

Il semble que cela ne soit pas possible en utilisant les technologies mentionnées ci-dessus (WSDL / XSD (approche contractuelle-première) en utilisant Maven, jaxws-maven-plugin, wsimport objectif).

Autres conseils

Pourriez-vous changer l'opération WSDL en ...

<portType name="TestWebService">
    <operation name="throwException">
        <input message="tns:empty"/>
        <output message="tns:empty"/>
        <fault name="fault" message="tns:BusinessException"/>
    </operation>
</portType>
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top