1

既存の 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ましたが、このアノテーションを明示的に追加した後に再試行しましたが、成功しませんでした。

私がここで間違っていることは何か分かりますか?

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 に答える