2011-08-11 10 views
5

Próbuję utworzyć ogólną usługę internetową, która zawsze będzie odpowiadać "OK", niezależnie od nagłówka lub zawartości treści żądania. Mogę to zrobić w Axis2 z RawXMLInOutMessageReceiver, ale wolałbym używać JAX-WS (który jestem całkowicie nowy), jeśli w ogóle możliwe. Do tej pory mam prosty interfejs:Czy mogę utworzyć ogólną metodę usługi internetowej/wysyłki, która odpowiada na WSZYSTKIE żądania z JAX-WS?

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

i prosty implementaion:

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

mogę skutecznie opublikować usługę z javax.xml.ws.Endpoint#publish(...), ale kiedy uderzył go w prosty wniosek mydło, np

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

Powitał mnie komunikat SOAPFault z informacją: Cannot find dispatch method for {}derp.

Czy można nawet utworzyć ogólną/niemrawą usługę sieciową, która będzie obsługiwać wszystko za pomocą JAX-WS? Jeśli tak, to czy ktoś może wskazać mi właściwy kierunek?


EDIT Dzięki końcówce z McDowell, udało mi się zrobić to z 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

Dlaczego po prostu nie utworzyć serwletu, aby to zrobić? Jaką wartość ma stack WS, dzięki któremu warto przeskakiwać przez obręcze? –

+0

To jest przeznaczone do testowania różnych klientów SOAP. Jest jeszcze dodatkowa praca do zrobienia w zakresie rejestrowania i manipulowania różnymi elementami nagłówka. Właśnie rzuciłem problem w celu wyjaśnienia wątpliwości. –

Odpowiedz

1

Spodziewam usługa oczekuje czegoś w postaci:

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

Dodaj ?WSDL do swojego punktu końcowego i sprawdź dane wejściowe operacji Typ XML i przestrzenie nazw.

Możliwe, że możesz coś zrobić z logical handler (javadoc), aby przekształcić przychodzące żądanie w ten formularz - nie próbowałem.

+0

Dzięki McDowell, udało mi się użyć javax.xml.ws.handler.soap.SOAPHandler, aby osiągnąć to, co chciałem, zapewniając, że handleFault i handleMessage zawsze zwracają dla wiadomości wychodzących. –