Der serverseitige JAX-WS-SOAPHandler, der einen Fehler zurückgibt, erhält unter WebSphere v8 den Wert "Interner Fehler"

Ich habe eine serverseitige JAX-WSSOAPHandler (unter WebSphere v8), die in bestimmten Fällen mit einer SOAP-Antwort auf den Client antworten muss, die in einer String-Variablen enthalten ist (nennen wir sieresponseXml).

WannresponseXml Wenn JAX-WS eine erfolgreiche (d. h. fehlerfreie) SOAP-Nachricht enthält, sendet es die Antwort korrekt an den Client. Wenn jedochresponseXml Enthält eine SOAP-Fehlermeldung, tritt ein "Interner Fehler" auf und der Client erhält eine andere Fehlerreaktion als die inresponseXml, wie hier gezeigt:

<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>

Der folgende Fehler wird in die Konsole geschrieben:

[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)
...

Hier ist eine vereinfachteSOAPHandler das verdeutlicht dieses Problem. (Beachten Sie, dass der Wert vonresponseXml hier gezeigt ist nur ein Beispiel. In meinem eigentlichenSOAPHandlersind die Antworten nicht fest codiert, sondern werden aus einer Datenbank gelesen. Ich versuche nur, den einfachsten möglichen Beispielcode zu zeigen.)

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) {
    }
}

Ich erhalte genau den gleichen Fehler, wenn ich das codiereSOAPHandler zu schaffen einSOAPFault Objekt (mit einemSOAPFactory) und wirf es in aSOAPFaultException.

Basierend auf dem Stack-Trace habe ich nach dem Quellcode gesuchtJAXWSMessageReceiverAxis2 sucht offenbar nach einer causeByException, aber in diesem Fall gibt es natürlich keine.

Weiß jemand, warum dies geschieht oder wie es behoben werden kann? Vielen Dank!

Antworten auf die Frage(5)

Ihre Antwort auf die Frage