2011-08-11 13 views
5

Talebin üstbilgisi veya gövde içeriğinden bağımsız olarak her zaman "Tamam" ile yanıt verecek genel bir web hizmeti oluşturmaya çalışıyorum. Bunu Axis2'de RawXMLInOutMessageReceiver ile yapabilirim, ancak mümkün olan her durumda JAX-WS'yi (tamamen yeniyim) kullanmayı tercih ederim.JAX-WS ile TÜM isteklere yanıt veren genel bir web hizmeti/gönderme yöntemi oluşturabilir miyim?

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

ve basit uygulanmaya konmuştur: ben basit SABUN isteği ile vurunca

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

başarıyla javax.xml.ws.Endpoint#publish(...) ile hizmet yayımlamak, ancak, örneğin Şimdiye kadar basit bir arayüze var

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

Bir SoapFault Cannot find dispatch method for {}derp belirten ile karşılandım.

JAX-WS ile her şeyi ACK yapacak bir genel/dilsiz web hizmeti oluşturmak mümkün mü? Eğer öyleyse, birisi bana doğru yönde işaret edebilir mi? McDowell gelen ucuna


DÜZENLEME sayesinde ben ile bunu başardı bir SOAPHandler:

Ben servis formunun bir şey bekliyor bekliyoruz
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

Bunu yapmak için neden sadece bir Servlet oluşturmuyoruz? WS yığınının, çemberler boyunca zıplamak için harcayacağınız değere getirme değeri nedir? –

+0

Bu, çeşitli SOAP istemcilerini test etmek için kullanılır. Çeşitli üstbilgi öğelerini günlüğe kaydetme ve işleme konusunda yapılacak daha fazla iş var. Sorunu açıklığa kavuşturmak için sorunu çözdüm. –

cevap

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> 

Bitiş noktanıza ?WSDL ekleyin ve işlem girişini inceleyin. XML türü ve ad alanları.

Gelen isteği bu forma dönüştürmek için logical handler (javadoc) ile bir şeyler yapabilirsiniz. Denemedim.

+0

Teşekkürler McDowell, ben outFund ve handleMessage her zaman giden iletiler için döndürmesini sağlayarak istediğimi gerçekleştirmek için bir javax.xml.ws.handler.soap.SOAPHandler kullanabildi. –

İlgili konular