サーバー側の 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
を作成し、それを にスローすると、まったく同じエラーが発生します。SOAPFault
SOAPFactory
SOAPFaultException
スタック トレースに基づいて、 のソース コードを調べたところJAXWSMessageReceiver
、裏で Axis2 が causeByException を探しているように見えますが、もちろん、この場合はありません。
なぜこれが起こっているのか、またはどのように修正できるのか誰にも分かりますか? ありがとう!