如何扩展使用WebFault注释的wsimport生成的异常?

时间:2009-12-17 10:07:44

标签: java soap annotations jbossws

我正在使用现有的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继承,但我在明确添加此注释后再次尝试,但没有成功。

知道我在这里做错了吗?

1 个答案:

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