我正在开发一个项目,我们希望使用已检查的异常来通知用户(例如)错误的输入或采取的错误操作。此类例外应具有以下层次结构:
public abstract class BusinessException extends java.lang.Exception {...}
public class InvalidInputException extends BusinessException {...}
public class InvalidActionException extends BusinessException {...}
我们使用Maven jaxws-maven-plugin
,目标wsimport
从WSDL / XSD(契约优先方法)生成java代码。
我尝试过这个(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
时,我得到以下内容(删除了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;
(...)
}
这不是我想要的,因为有一个例外,它可以容纳不同的faultInto
数据。有没有办法创建异常层次结构,如上所述纯粹在XSD / WSDL中?由于ExceptionMessage
类是直接从<message>
标记生成的,因此无法在那里找到创建父/子的方法。
答案 0 :(得分:0)
您可以将WSDL操作更改为...
<portType name="TestWebService">
<operation name="throwException">
<input message="tns:empty"/>
<output message="tns:empty"/>
<fault name="fault" message="tns:BusinessException"/>
</operation>
</portType>
答案 1 :(得分:0)
使用Maven,jaxws-maven-plugin
,wsimport
目标,似乎无法使用上述技术(WSDL / XSD(契约优先方法))。