使用JAX-WS Maven插件(wsimport)检查WebServices中的异常层次结构

Ond*_*cka 6 java inheritance exception jax-ws wsimport

我正在开发一个项目,我们希望使用已检查的异常来通知用户(例如)错误的输入或采取的错误操作.此类例外应具有以下层次结构:

public abstract class BusinessException extends java.lang.Exception {...}
public class InvalidInputException extends BusinessException {...}
public class InvalidActionException extends BusinessException {...}
Run Code Online (Sandbox Code Playgroud)

我们使用Maven jaxws-maven-plugin,目标从WSDL/XSD(契约优先方法)生成java代码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>
Run Code Online (Sandbox Code Playgroud)

使用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"/>
Run Code Online (Sandbox Code Playgroud)

当我运行时mvn clean package,我得到以下(删除了getter,setter,ctors和annotations):

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;
    (...)
}
Run Code Online (Sandbox Code Playgroud)

这不是我想要的,因为有一个例外,它可以容纳不同的faultInto数据.有没有办法创建异常层次结构,如上所述纯粹在XSD/WSDL中?由于ExceptionMessage该类是直接从<message>标记生成的,因此我无法找到在那里创建父/子的方法.

Ond*_*cka 0

jaxws-maven-plugin使用上面提到的技术(使用 Maven 的 WSDL/XSD(契约优先方法) 、目标)似乎不可能实现这一点wsimport