El SOAPHandler del lado del servidor JAX-WS que devuelve el error obtiene "Error interno" en WebSphere v8

Tengo un servidor JAX-WSSOAPHandler (en WebSphere v8) que en ciertos casos necesita responder al cliente con una respuesta SOAP que tiene en una variable de cadena (llamémoslaresponseXml).

CuandoresponseXml contiene un mensaje SOAP exitoso (es decir, sin fallo), JAX-WS envía la respuesta al cliente correctamente. Sin embargo cuandoresponseXml contiene un mensaje de error de SOAP, se produce un "Error interno" y el cliente obtiene una respuesta de error diferente a la deresponseXml, como se muestra aquí:

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

El siguiente error se escribe en la consola:

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

Aquí hay un simplificadoSOAPHandler Eso ilustra este problema. (Tenga en cuenta que el valor deresponseXml Aquí se muestra solo un ejemplo. En mi actualSOAPHandler, las respuestas no están codificadas, pero se leen desde una base de datos. Solo intento mostrar el código de muestra más simple posible.)

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

Recibo exactamente el mismo error cuando codifico elSOAPHandler para crear unSOAPFault objeto (usando unSOAPFactory) y tirarlo en unSOAPFaultException.

Basado en el seguimiento de la pila, miré el código fuente paraJAXWSMessageReceiver, y parece que debajo de las portadas, Axis2 está buscando una causaByException, pero, por supuesto, en este caso no hay ninguna.

¿Alguien sabe por qué sucede esto o cómo se puede arreglar? ¡Gracias!

Respuestas a la pregunta(5)

Su respuesta a la pregunta