2011-08-11 8 views
5

Estoy tratando de crear un servicio web genérico que siempre responda con "OK", independientemente del encabezado de la solicitud o el contenido del cuerpo. Puedo hacer esto en Axis2 con un RawXMLInOutMessageReceiver, pero prefiero usar JAX-WS (que soy completamente nuevo) si es posible. Hasta ahora tengo una interfaz sencilla:¿Puedo crear un método de envío/servicio web genérico que responda a TODAS las solicitudes con JAX-WS?

@WebService 
public interface DummyService { 
    @WebMethod String processMessage(Object obj); 
} 

y una implementaion simple:

@WebService(endpointInterface = "com.dummyservice.DummyService") 
public class DummyServiceImpl implements DummyService { 
    @Override 
    public String processMessage(Object obj) { 
     return "OK"; 
    } 
} 

puedo publicar correctamente el servicio con javax.xml.ws.Endpoint#publish(...), pero cuando me golpeó con una petición SOAP simple, por ejemplo,

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <derp/> 
    </soapenv:Body> 
</soapenv:Envelope> 

estoy recibidos con una SOAPFault indicando Cannot find dispatch method for {}derp.

¿Es posible crear un servicio web genérico/tonto que ACK todo con JAX-WS? Si es así, ¿podría alguien señalarme en la dirección correcta?


EDIT Gracias a la punta de McDowell, que era capaz de hacer esto con un SOAPHandler:

public class DummySOAPHandler implements SOAPHandler { 

    @Override 
    public boolean handleMessage(MessageContext context) { 
     return process((SOAPMessageContext) context); 
    } 

    @Override 
    public boolean handleFault(MessageContext context) { 
     return process((SOAPMessageContext) context); 
    } 

    @Override 
    public void close(MessageContext context) { } 

    @Override 
    public Set<QName> getHeaders() { 
     return null; 
    } 

    private boolean process(SOAPMessageContext ctx) { 

     try { 
      SOAPMessage message = ctx.getMessage(); 
      SOAPEnvelope envelope = message.getSOAPPart().getEnvelope(); 
      SOAPBody body = message.getSOAPBody(); 

      if ((Boolean) ctx.get (MessageContext.MESSAGE_OUTBOUND_PROPERTY)) { 
       Iterator<SOAPElement> bodyChildren = body.getChildElements(); 
       while (bodyChildren.hasNext()) { 
        SOAPElement child = bodyChildren.next(); 
        child.detachNode(); 
       } 

       body.addBodyElement(envelope.createName("OK")); 
       message.saveChanges(); 
      } 
     } catch (SOAPException e) { 
      e.printStackTrace(); 
     } 

     return true; 
    } 
} 
+1

¿Por qué no simplemente crear Servlet para hacer esto? ¿Qué valor le aporta la pila de WS para que valga la pena saltar por sus aros? –

+0

Esto se debe usar para probar varios clientes SOAP. Hay trabajo adicional por hacer con respecto al registro y la manipulación de varios elementos del encabezado. Acabo de simplificar el problema por cuestiones de claridad de la pregunta. –

Respuesta

1

espero que su servicio está esperando algo de la forma:

<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/" 
        xmlns:dum="http://yournamespace/"> 
    <soapenv:Header/> 
    <soapenv:Body> 
    <dum:processMessage> 
    <!-- xsd:anyType --> 
    </dum:processMessage> 
    </soapenv:Body> 
</soapenv:Envelope> 

Agregue ?WSDL a su punto final e inspeccione la entrada de operación Tipo de XML y los espacios de nombres

Es posible que pueda hacer algo con un logical handler (javadoc) para transformar la solicitud entrante a este formulario - No lo he intentado.

+0

Gracias a McDowell, pude usar javax.xml.ws.handler.soap.SOAPHandler para lograr lo que quería, asegurándome de que handleFault y handleMessage siempre devolvieran para los mensajes salientes. –

Cuestiones relacionadas