0

JAX-WSoverSOAPを使用してWebサービスクライアントを実装しています。そのエラーコードは次の方法で返されます。

<?xml version = '1.0' encoding = 'UTF-8'?>
<env:Envelope xmlns:env="http://schemas.xmlsoap.org/soap/envelope/" xmlns:xsi="http://www.w3.org/1999/XMLSchema-instance" xmlns:xsd="http://www.w3.org/1999/XMLSchema">
   <env:Header>
      <!-- header stuff goes here -->
   </env:Header>
   <env:Body>
      <env:Fault>
        <abc:fault xmlns:abc="http://example.com/abc">
           <abc:faultcode>12345</abc:faultcode>
           <abc:faultstring>Error message goes here</abc:faultstring>
        </abc:fault>
     </env:Fault>
   </env:Body>
</env:Envelope>

私の知る限り、これはSOAP障害を実行する正しい方法ではありません。env:Faultのサブ要素は、別の名前空間ではなく、<faultcode>とである必要があります。残念ながら、これをWebサービスに変更させる方法はありません。<faultstring><fault>

私の望みは、SOAPHandlerでこのメッセージを解析し、コードの残りの部分に渡す前に通常の障害に変換できることでしたが、以前のハンドラーにメッセージを記録すると、Fault要素が完全に表示されました。空。<abc:fault>なくなった!

WebSphere 7でJAX-WSを使用しており、システムプロパティで「jaxws.payload.highFidelity」をtrueに設定してみました。元のメッセージを取得する方法についての手がかりはありますか?

これをそのままにしておくと、JAX-WSがフォールトコードを見つけることができないため、NullPointerExceptionを伴うWebServiceExceptionが発生します。

4

2 に答える 2

1

だから私は私の質問に対する答えを見つけました。WebSphere 7 は Axis2 を使用します。Axis2 の MessageContext は、ByteArrayInputStream を含む「TRANSPORT_IN」というプロパティを提供します。名前が示すように、TRANSPORT_IN には、受信した正確な SOAP メッセージが含まれます。

SAXHandler を使用して Handler#handleFault メソッドで元の SOAP メッセージを解析し、abc:fault メッセージを取得しました。次に、abc:fault > faultcode と faultstring を soapenv:Fault faultcode と faultstring に書き込みました。その後、私のアプリケーションは SOAPFaultException を通常の処理のように処理します。

これは回りくどい方法のように感じるので、私はまだより良い答えに対して非常にオープンです。

ハンドラー コード:

public boolean handleFault(SOAPMessageContext context) {
    SOAPMessage m = context.getMessage();
    if(m != null) {
        SOAPBody body = m.getSOAPBody();
        SOAPFault fault = body.getFault();
        setAbcFault(fault, context);
    }
}

private void setAbcFault(SOAPFault fault, MessageContext context) {
    ByteArrayInputStream bis = (ByteArrayInputStream)context.get("TRANSPORT_IN");
    // do sax parsing on the input stream
    fault.setFaultCode(abcFaultCodeQName);
    fault.setFaultString(abcFaultString);
}
于 2013-01-27T17:39:12.357 に答える
0

JAX-WS を使用している場合は、SOAP フォールトを使用できます。@WebFaultまたは、注釈付きの例外が必要です。Using SOAP Faults and Exceptions in Java JAX-WS Web Services - Eben Hewitt on Java に良い例があります。

null を返すか、例外をスローするための回答と、JAX-WS Web サービスでカスタム エラーをスローする方法を参照してください。

例:

@WebService
public class CalculatorWS {

    public String factorial(int n) throws FactorialException {
        if (n < 0) {
            throw new FactorialException("Negative number!",     // faultstring
                                         "The number n = " + n); // detail
        }
        return BigIntegerMath.factorial(n).toString();
    }

}

と:

public class FactorialException extends Exception {

    String detail;

    public FactorialException(String message, String detail) {
        super(message);
        this.detail = detail;
    }

    public String getFaultInfo() {
        return detail;
    }

}

リクエストが次の場合:

<soapenv:Envelope ... >
   <soapenv:Header/>
   <soapenv:Body>
      <test:factorial>
         <arg0>-1</arg0>
      </test:factorial>
   </soapenv:Body>
</soapenv:Envelope>

応答は次のとおりです。

<soapenv:Envelope ... >
   <soapenv:Body>
      <soapenv:Fault>
         <faultcode>soapenv:Server</faultcode>
         <faultstring>Negative number!</faultstring>
         <detail>
            <ns2:FactorialExceptionBean xmlns:ns2="http://...">
                The number n = -1
            </ns2:FactorialExceptionBean>
         </detail>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>

( Websphere 7 でテスト済み)

于 2013-01-26T00:32:31.913 に答える