Проверена иерархия исключений в WebServices с использованием плагина JAX-WS Maven (wsimport) - PullRequest
6 голосов
/ 04 февраля 2011

Я работаю над проектом, в котором мы хотим использовать проверенные исключения, чтобы уведомить пользователя (например) о неправильном вводе или о предпринятых неправильных действиях. Такие исключения должны иметь иерархию, такую ​​как:

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

Мы генерируем Java-код из WSDL / XSD (первый контрактный подход), используя Maven, jaxws-maven-plugin, цель wsimport.

Я пытался пройти этот (http://www.ibm.com/developerworks/xml/library/ws-tip-jaxrpc.html) учебник (он предназначен для jax-rpc, но, похоже, работает и для jax-ws). Я написал

<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>

с типами, определенными в ows: namespace

<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"/>

Когда я запускаю mvn clean package, я получаю следующее (удаляются получатели, установщики, ctors и аннотации):

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;
    (...)
}

Это не то, что я хотел, потому что есть одно исключение, и оно может содержать разные faultInto данные. Есть ли способ создать иерархию исключений, как отмечено выше, чисто в XSD / WSDL? Так как класс ExceptionMessage генерируется непосредственно из тега <message>, я не смог найти способ создания там родителя / ребенка.

Ответы [ 2 ]

0 голосов
/ 14 февраля 2012

Похоже, что это невозможно при использовании технологий, упомянутых выше (WSDL / XSD (подход по контракту вначале) с использованием Maven, jaxws-maven-plugin, wsimport goal).

0 голосов
/ 09 февраля 2011

Не могли бы вы изменить операцию WSDL на ...

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