16

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

成功した (つまり、障害のない) SOAP メッセージが含まれている場合responseXml、JAX-WS は応答をクライアントに正しく送信します。ただし、 SOAP 障害メッセージが含まれている場合は、「内部エラー」が発生し、次に示すようresponseXmlに、クライアントは とは異なる障害応答を受け取ります。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を作成し、それを にスローすると、まったく同じエラーが発生します。SOAPFaultSOAPFactorySOAPFaultException

スタック トレースに基づいて、 のソース コードを調べたところJAXWSMessageReceiver、裏で Axis2 が causeByException を探しているように見えますが、もちろん、この場合はありません。

なぜこれが起こっているのか、またはどのように修正できるのか誰にも分かりますか? ありがとう!

4

5 に答える 5

3

実際の問題は、例外による欠落ではなく、Websphere での統一された障害処理です。

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

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

于 2012-11-20T13:01:15.753 に答える
2

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

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

于 2014-02-11T13:58:33.530 に答える
0

このエラーは、IBM Websphere アプリケーション サーバーで一般的な障害処理機能を無効にすることで解決できます。

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

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

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

于 2016-05-20T05:02:27.103 に答える