2011-08-11 10 views
5

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; 
    } 
} 
+1

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ì? –

+0

Đ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. –

Trả lời

1

Tôi hy vọng dịch vụ của bạn đang chờ đợi một cái gì đó có dạng:

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

Thêm ?WSDL vào điểm cuối của bạn và kiểm tra đầu vào hoạt động Loại XML và không gian tên.

Bạn có thể làm điều gì đó với logical handler (javadoc) để chuyển yêu cầu gửi đến biểu mẫu này - Tôi chưa thử.

+0

Cảm ơn McDowell, tôi đã có thể sử dụng một javax.xml.ws.handler.soap.SOAPHandler để thực hiện những gì tôi muốn bằng cách đảm bảo rằng handleFault và handleMessage luôn trả về cho các thư gửi đi. –

Các vấn đề liên quan