web-dev-qa-db-ja.com

障害を返すJAX-WSサーバー側SOAPHandlerがWebSphere v8で「内部エラー」を取得する

サーバー側のJAX-WS SOAPHandler(WebSphere v8の場合)があり、これは特定の場合に、String変数にあるSOAP応答でクライアントに応答する必要があります。 (これをresponseXmlと呼びましょう)。

responseXmlに成功(つまり、障害ではない)SOAPメッセージが含まれている場合、JAX-WSはクライアントに応答を正しく送信します。ただし、responseXmlがa SOAP障害メッセージ、「内部エラー」が発生し、次に示すように、クライアントはresponseXmlの障害応答とは異なる障害応答を受け取ります。

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
   <soapenv:Body>
      <soapenv:Fault xmlns:axis2ns1="http://schemas.xmlsoap.org/soap/envelope/">
         <faultcode>axis2ns1:Server</faultcode>
         <faultstring>Internal Error</faultstring>
         <detail/>
      </soapenv:Fault>
   </soapenv:Body>
</soapenv:Envelope>

次のエラーがコンソールに書き込まれます。

[10/9/12 12:21:04:177 EDT] 00000025 AxisEngine    E org.Apache.axis2.engine.AxisEngine receive An error was detected during JAXWS processing
                             org.Apache.axis2.AxisFault: An error was detected during JAXWS processing
at org.Apache.axis2.jaxws.server.JAXWSMessageReceiver.receive(JAXWSMessageReceiver.Java:208)
at org.Apache.axis2.engine.AxisEngine.receive(AxisEngine.Java:198)
at org.Apache.axis2.transport.http.HTTPTransportUtils.processHTTPPostRequest(HTTPTransportUtils.Java:172)
at com.ibm.ws.websvcs.transport.http.WASAxis2Servlet.doPost(WASAxis2Servlet.Java:1466)
at javax.servlet.http.HttpServlet.service(HttpServlet.Java:595)
...

これは、この問題を示す簡略化されたSOAPHandlerです。 (ここに表示されているresponseXmlの値は単なる例です。実際のSOAPHandlerでは、応答はハードコーディングされていませんが、データベースから読み取られています。表示しようとしているだけです。可能な限り最も単純なサンプルコード)

package simplified.demo;

import Java.io.ByteArrayInputStream;
import Java.util.Set;

import javax.xml.namespace.QName;
import javax.xml.soap.MessageFactory;
import javax.xml.soap.SOAPMessage;
import javax.xml.ws.handler.MessageContext;
import javax.xml.ws.handler.soap.SOAPHandler;
import javax.xml.ws.handler.soap.SOAPMessageContext;

public class FaultyHandler implements SOAPHandler<SOAPMessageContext> {

    @Override
    public boolean handleMessage(SOAPMessageContext context) {
        Boolean outbound = (Boolean) context.get(MessageContext.MESSAGE_OUTBOUND_PROPERTY);

        if (!outbound) {
            String responseXml = "<soapenv:Envelope xmlns:soapenv=\"http://schemas.xmlsoap.org/soap/envelope/\"><soapenv:Header></soapenv:Header><soapenv:Body><soapenv:Fault><faultcode>soapenv:Server</faultcode><faultstring>ORA-01031: insufficient privileges</faultstring><detail/></soapenv:Fault></soapenv:Body></soapenv:Envelope>";
            try {
                SOAPMessage newMsg = createSOAPMessage(responseXml);
                context.setMessage(newMsg);
            } catch (Exception e) {
                throw new RuntimeException(e);
            }
        }

        return (outbound);
    }

    private SOAPMessage createSOAPMessage(String responseXml) {
        try {
            ByteArrayInputStream in = new ByteArrayInputStream(responseXml.getBytes());
            MessageFactory messageFactory = MessageFactory.newInstance();
            return messageFactory.createMessage(null, in);
        } catch (Exception e) {
            throw new RuntimeException(e);
        }
    }

    @Override
    public boolean handleFault(SOAPMessageContext context) {
        return true;
    }

    @Override
    public Set<QName> getHeaders() {
        return null;
    }

    @Override
    public void close(MessageContext context) {
    }
}

SOAPHandlerをコーディングしてSOAPFaultオブジェクトを作成し(SOAPFactoryを使用)、SOAPFaultExceptionにスローすると、まったく同じエラーが発生します。

スタックトレースに基づいて、私は JAXWSMessageReceiver のソースコードを確認しました。これはカバーの下にあるように見えます。Axis2はcauseByExceptionを探していますが、もちろんこの場合はありません。ない。

なぜこれが起こっているのか、それをどのように修正できるのか知っていますか?ありがとう!

15
user1717528

実際の問題は、例外が原因の欠落ではなく、websphereでの統合された障害処理です。

http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524

説明されている回避策を使用するか、少なくとも8.0.0.4をインストールしてください

3
Thomas

バージョン8以降のWebSphereにはデフォルトで有効になっているセキュリティ機能があり、「内部エラー」というメッセージを返すだけです。これは、「 インバウンドメッセージ処理が失敗した理由に関する詳細情報がメッセージ送信者に返されないようにすること 」に対して行われます。 「webservices.unify.faults」を検索

この機能を無効にするには、JVMカスタムプロパティに-Dwebservices.unify.faults = falseを追加します。

1
gregory

このエラーは、IBM Websphere Application Serverで一般的な障害処理機能を無効にすることで解決できます。

このプロパティを無効にするには、アドミンコンソール>サーバー>アプリケーションサーバー>>プロセス定義> Java仮想マシン>カスタムプロパティ)に移動します。

キーを「webservice.unify.faults」、値を「false」と入力します。

更新したら、サーバーを再起動してEARをインストールし、SOAPトランザクションのカスタムWSDLエラーを取得します。

0
Pawan J

WASをアップグレードした後も同じ問題が発生しましたFP 8.5.5.1 to 8.5.5.12。まったく同じメソッド名の2つのサービスがありましたDomainService1には'get'メソッドがあり、DomainService2にも'get'があるように、targetNameSpaceは異なりますメソッドですが、WAS 8.5.5.12はこの例外をスローし、根本的な原因を見つける手掛かりを与えません。明らかに、最近のバージョンでは、メソッドの名前がWASの方が厳密です。

これは例外でした:org.Apache.axis2.jaxws.wrapper.impl.JAXBWrapperException:内部アサーションエラーが発生しました。 com.xxx.web.myapp.services.jaxws.GetResponse JAXBオブジェクトにxxxxxStatus xmlがありません

各サービス「getABC」および「getPQR」に固有のメソッドの名前を変更した後、それは機能しました!!!

これがうまくいくことを願っています!

0
budipem