我正在使用现有的WSDL在Java中构建Web服务。 wsimport
工具生成了绑定到服务模式中元素的所有Java类。特别是,故障声明产生以下类:
@javax.xml.ws.WebFault(name = "Fault", targetNamespace = "http://my.company.com/service-1")
public class ServiceFault extends java.lang.Exception {
// constructors and faulInfo getter
}
现在我想扩展这个类,所以我可以添加更多行为:
public class MyServiceFault extends ServiceFault {
// some behavior
}
当我现在从我的应用程序中抛出MyServiceFault
的实例时,我希望在SOAP答案中将这些错误正确地序列化为XML。但相反,我得到这样的东西:
<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>
也就是说,我完全错过了faultInfo元素。我的SOAP堆栈将MyServiceFault
视为任何其他异常,而不是表示服务中的错误的异常。
我首先想到的是@WebFault
注释没有被MyServiceFault
继承,但我在明确添加此注释后再次尝试,但没有成功。
知道我在这里做错了吗?
答案 0 :(得分:0)
为了它的价值,我已经用这种方式实现了它。
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;
}
}
产生类似的东西:
<?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>