1

我正在从现有的 WSDL 用 Ja​​va 构建 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,但是我在显式添加此注释后再次尝试,但没有成功。

知道我在这里做错了什么吗?

4

1 回答 1

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>
于 2010-02-09T01:26:35.353 回答