サーバー側の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を探していますが、もちろんこの場合はありません。ない。
なぜこれが起こっているのか、それをどのように修正できるのか知っていますか?ありがとう!
実際の問題は、例外が原因の欠落ではなく、websphereでの統合された障害処理です。
http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524
説明されている回避策を使用するか、少なくとも8.0.0.4をインストールしてください
バージョン8以降のWebSphereにはデフォルトで有効になっているセキュリティ機能があり、「内部エラー」というメッセージを返すだけです。これは、「 インバウンドメッセージ処理が失敗した理由に関する詳細情報がメッセージ送信者に返されないようにすること 」に対して行われます。 「webservices.unify.faults」を検索
この機能を無効にするには、JVMカスタムプロパティに-Dwebservices.unify.faults = falseを追加します。
このエラーは、IBM Websphere Application Serverで一般的な障害処理機能を無効にすることで解決できます。
このプロパティを無効にするには、アドミンコンソール>サーバー>アプリケーションサーバー>>プロセス定義> Java仮想マシン>カスタムプロパティ)に移動します。
キーを「webservice.unify.faults」、値を「false」と入力します。
更新したら、サーバーを再起動してEARをインストールし、SOAPトランザクションのカスタムWSDLエラーを取得します。
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」に固有のメソッドの名前を変更した後、それは機能しました!!!
これがうまくいくことを願っています!