Tôi đang cố gắng tạo một dịch vụ web chung chung sẽ luôn trả lời bằng "OK", bất kể nội dung của phần đầu hoặc nội dung của yêu cầu. Tôi có thể làm điều này trong Axis2 với RawXMLInOutMessageReceiver
, nhưng tôi muốn sử dụng JAX-WS (mà tôi hoàn toàn mới) nếu có thể. Cho đến nay tôi đã có một giao diện đơn giản:Tôi có thể tạo một phương thức dịch vụ/công văn web chung để đáp ứng TẤT CẢ các yêu cầu với JAX-WS không?
@WebService
public interface DummyService {
@WebMethod String processMessage(Object obj);
}
và implementaion đơn giản:
@WebService(endpointInterface = "com.dummyservice.DummyService")
public class DummyServiceImpl implements DummyService {
@Override
public String processMessage(Object obj) {
return "OK";
}
}
tôi thành công có thể xuất bản các dịch vụ với javax.xml.ws.Endpoint#publish(...)
, nhưng khi tôi nhấn nó với một yêu cầu SOAP đơn giản, ví dụ
<soapenv:Envelope xmlns:soapenv="http://schemas.xmlsoap.org/soap/envelope/">
<soapenv:Header/>
<soapenv:Body>
<derp/>
</soapenv:Body>
</soapenv:Envelope>
Tôi được chào đón bằng SOAPFault nêu rõ Cannot find dispatch method for {}derp
.
Thậm chí có thể tạo một dịch vụ web chung/câm để ACK mọi thứ với JAX-WS không? Nếu có, ai đó có thể chỉ cho tôi đi đúng hướng không?
EDIT Nhờ đầu từ McDowell, tôi đã có thể làm điều này với một 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;
}
}
Tại sao không chỉ đơn giản là tạo Servlet để làm điều này? Giá trị của WS stack mang lại cho bạn để làm cho nó có giá trị trong khi nhảy qua hoops của nó là gì? –
Điều này có nghĩa là được sử dụng để kiểm tra các máy khách SOAP khác nhau. Có thêm công việc cần phải thực hiện liên quan đến việc ghi nhật ký và thao tác với nhiều phần tử tiêu đề khác nhau, tôi vừa làm hỏng vấn đề này vì lợi ích của câu hỏi rõ ràng. –