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!