JAX-WS serverseitige SOAPHandler zurückgibt, die Schuld bekommt "Internen Fehler" auf WebSphere v8

Ich habe eine server-side-JAX-WS SOAPHandler (auf WebSphere v8), dass in bestimmten Fällen reagieren muss, um dem client eine SOAP-Antwort, dass es in einer String-variable (nennen wir es responseXml).

Wenn responseXml enthält eine erfolgreiche (d.h., nicht-Schuld) SOAP-Nachricht, JAX-WS sendet die Antwort an den client korrekt. Allerdings, wenn responseXml enthält eine SOAP-fault-Nachricht, einen "Internen Fehler" Auftritt, und der client bekommt einen anderen Fehler als Antwort, als die, die in responseXmlwie 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>

Wird die folgende Fehlermeldung 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 vereinfachte SOAPHandler illustriert dieses problem. (Beachten Sie, dass der Wert von responseXml hier gezeigt wird, ist nur ein Beispiel. In meiner tatsächlichen SOAPHandlerdie Antworten sind nicht hart codiert, sondern werden aus einer Datenbank ausgelesen. Ich versuche nur zu zeigen das einfachste Beispiel-code möglich.)

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 bekomme die exakt gleiche Fehlermeldung, wenn ich code die SOAPHandler zu erstellen SOAPFault - Objekt (mit einem SOAPFactory) und werfen Sie es in eine SOAPFaultException.

Basierend auf den stack-trace, sah ich auf den source-code für JAXWSMessageReceiverund es sieht aus wie unter der Decke, Axis2 ist auf der Suche nach einem causedByException, aber natürlich gibt es in diesem Fall nicht ein.

Weiß jemand, warum dies passiert ist oder wie es behoben werden kann? Danke!

InformationsquelleAutor der Frage user1717528 | 2012-10-09

Schreibe einen Kommentar