2012-10-09 19 views
15

Tengo un servidor JAX-WS SOAPHandler (en WebSphere v8) que en ciertos casos necesita responder al cliente con una respuesta SOAP que tiene en una variable String (llamémoslo responseXml).JAX-WS SOAPHandler del lado del servidor que devuelve un error obtiene "Error interno" en WebSphere v8

Cuando responseXml contiene un mensaje SOAP satisfactorio (es decir, sin culpa), JAX-WS envía la respuesta al cliente correctamente. Sin embargo, cuando responseXml contiene un mensaje de error SOAP, un "Error interno" se produce, y el cliente obtiene una respuesta de fallo diferente a la que en responseXml, 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í es una simplificada SOAPHandler que ilustra este problema. (Tenga en cuenta que el valor de responseXml que se muestra aquí es solo un ejemplo. En mi actual SOAPHandler, 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) { 
    } 
} 

me sale el mismo error exacto cuando Códigos el SOAPHandler para crear un objeto SOAPFault (utilizando un SOAPFactory), y echarlo en un SOAPFaultException.

Basado en el seguimiento de la pila, miré el código fuente de JAXWSMessageReceiver, y parece que debajo de las coberturas, Axis2 está buscando una excepción causada, pero por supuesto en este caso no hay una.

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

Respuesta

3

El problema real no se los desaparecidos causada por excepción, es más bien una manipulación en WebSphere culpa unificada:

http://www-01.ibm.com/support/docview.wss?uid=swg1PM58524

utilizar la solución descrita o instalar al menos 8.0.0.4

+0

Tengo WAS 8.5.5 pero todavía tenía que aplicar la variable we services.unify.faults para solucionar el problema –

3

Tuve el mismo problema y pude resolverlo desactivando el manejo unificado de fallas (¡no es un error, es una función!).

En el WAS consola de desarrollador

https://<yourhost>/<yourport>/ibm/console/login.do 

hacer como se describe here (por WAS8):

Haga clic en Servidores> Tipos de servidor. , y ya sea servidores de aplicaciones WebSphere> nombre_servidor o servidores proxy WebSphere> nombre_servidor. A continuación, en la sección Infraestructura del servidor, haga clic en Java y gestión de procesos> Definición del proceso, y seleccione Control, Servidor o Adjunct. A continuación, haga clic en Máquina virtual Java> Propiedades personalizadas.

Allí, añadir una nueva propiedad webservices.unify.faults y establezca el valor en false.

enter image description here

0

Este error se puede resolver mediante la desactivación de la función de manejo en servidores de aplicaciones IBM WebSphere defecto genérico.

Para deshabilitar esta propiedad, vaya a la Consola de administración> Servidores> Servidores de aplicaciones>> Definición de proceso> Máquina virtual Java> Propiedades personalizadas.

Ingrese la clave como 'webservice.unify.faults' y valor como 'falso'.

Una vez actualizado, reinicie su servidor e instale los EAR para obtener los errores WSDL personalizados para sus transacciones SOAP.

0

que tenían el mismo problema después de actualizar WAS FP 8.5.5.10 a 8.5.5.12. Hemos tenido dos servicios con exactamente el mismo nombre pero diferente método targetNamespace, como DomainService1 tiene 'conseguir' método y DomainService2 también tiene 'conseguir' método, pero fue 8.5.5.12 lanza esta excepción y no da cualquier pista para encontrar la causa raíz. Aparentemente, WAS es más estricto en la versión más reciente al nombrar los métodos.

Esta fue la excepción: org.apache.axis2.jaxws.wrapper.impl.JAXBWrapperException: Se produjo un error de aserción interna. El objeto com.xxx.web.myapp.services.jaxws.GetResponse JAXB no tiene un xml xxxxxStatus

Después de cambiar el nombre del método específico para cada servicio 'getABC' y 'getPQR' funcionó !!!

Espero que esto funcione!

Cuestiones relacionadas