我可以创建一个通用Web服务/调度方法来响应使用JAX-WS的所有请求吗?

时间:2011-08-11 15:07:40

标签: java web-services soap jax-ws

我正在尝试创建一个通用的Web服务,它始终以“OK”响应,无论请求的标题或正文内容如何。我可以在Axis2中使用RawXMLInOutMessageReceiver执行此操作,但是如果可能的话,我更愿意使用JAX-WS(我完全是新手)。到目前为止,我有一个简单的界面:

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

和一个简单的实现:

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

我可以使用javax.xml.ws.Endpoint#publish(...)成功发布服务,但是当我用简单的SOAP请求命中时,例如

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

我收到一封说明Cannot find dispatch method for {}derp的SOAPFault。

是否甚至可以创建一个通用/哑巴的Web服务,它将使用JAX-WS确认所有内容?如果是这样,有人会指出我正确的方向吗?


修改 感谢麦克道尔的小费,我能够用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 个答案:

答案 0 :(得分:1)

我希望您的服务能够满足以下形式:

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

?WSDL添加到您的端点并检查操作输入XML类型和命名空间。

您可以使用logical handlerjavadoc)执行某些操作,将传入的请求转换为此表单 - 我还没试过。