मैं एक सामान्य वेब सेवा बनाने की कोशिश कर रहा हूं जो अनुरोध के शीर्षलेख या बॉडी सामग्री के बावजूद हमेशा "ठीक" के साथ प्रतिक्रिया देगी। मैं इसे 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 द्वारा बधाई दी गई है।

क्या एक सामान्य/गूंगा वेब सेवा बनाना भी संभव है जो JAX-WS के साथ सब कुछ ACK करेगी? यदि हां, तो क्या कोई मुझे सही दिशा में इंगित कर सकता है?


संपादित करें मैकडॉवेल की टिप के लिए धन्यवाद, मैं इसे 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;
    }
}
5
Justin Garrick 11 अगस्त 2011, 19:07
1
ऐसा करने के लिए बस सर्वलेट क्यों न बनाएं? WS स्टैक आपको इसके हुप्स के माध्यम से कूदने के लायक बनाने के लिए क्या मूल्य ला रहा है?
 – 
Will Hartung
12 अगस्त 2011, 00:37
इसका उपयोग विभिन्न SOAP ग्राहकों का परीक्षण करने के लिए किया जाता है। विभिन्न शीर्षलेख तत्वों को लॉगिंग और हेरफेर करने के संबंध में अतिरिक्त काम किया जाना है, मैंने प्रश्न स्पष्टता के लिए समस्या को कम कर दिया है।
 – 
Justin Garrick
12 अगस्त 2011, 20:59

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 जोड़ें और ऑपरेशन इनपुट एक्सएमएल टाइप और नेमस्पेस का निरीक्षण करें।

आप लॉजिकल हैंडलर (javadoc) - मैंने कोशिश नहीं की है।

1
McDowell 12 अगस्त 2011, 00:30
धन्यवाद मैकडॉवेल, मैं यह सुनिश्चित करने के लिए javax.xml.ws.handler.soap.SOAPHandler का उपयोग करने में सक्षम था कि हैंडलफॉल्ट और हैंडल मैसेज हमेशा आउटबाउंड संदेशों के लिए लौटाएं।
 – 
Justin Garrick
12 अगस्त 2011, 21:02