我正在尝试创建一个通用的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;
}
}
答案 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 handler(javadoc)执行某些操作,将传入的请求转换为此表单 - 我还没试过。