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;
}
}
¿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? –
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. –