2010-07-08 6 views
5

मैं एक वेब सेवा के लिए एक इंटरसेप्टर लिखने की कोशिश कर रहा हूं जो एंडपॉइंट पर भेजे जाने से पहले साबुन संदेश की सामग्री को संशोधित करेगा। यदि किसी क्लाइंट ने एक संदेश भेजा है जहां कुछ तत्व का मान 1 है, तो मैं उस तत्व को 2 में बदलने में सक्षम होना चाहता हूं ताकि जब संदेश एंडपॉइंट पर आता है, ऐसा लगता है कि क्लाइंट ने 2 के बजाय 2 सबमिट किया है 1. मुझे यकीन नहीं है कि यह एक कठिन काम है जो मुझे परेशान कर रहा है, या एक आसान काम जिसे मैं कठिन बना रहा हूं, उससे होने की आवश्यकता है।स्प्रिंग साबुन इंटरसेप्टर एक संदेश की सामग्री को कैसे संशोधित कर सकता है?

मैंने स्प्रिंग इंटरसेप्टर के कुछ कदम उठाए हैं; लेकिन प्रमाणीकरण और लॉगिंग इंटरसेप्टर प्रत्येक संदेश को पारगमन में परिवर्तित नहीं करते हैं। Wss4jSecurityInterceptor MessageContext में कुछ गुण जोड़ता है; लेकिन मैं ऐसा कुछ भी नहीं कर पा रहा हूं जो यह कर रहा है। मेरे पास एक इंटरसेप्टर का खोल है; लेकिन कुछ भी नहीं जो किसी भी मूल्य के कुछ भी कर रहा है।

public boolean handleRequest(MessageContext messageContext, Object endpoint) 
     throws Exception { 

    SaajSoapMessage saajSoapMessage = (SaajSoapMessage) messageContext 
      .getRequest(); 
    SOAPMessage soapMessage = saajSoapMessage.getSaajMessage(); 
    SOAPBody soapBody = soapMessage.getSOAPBody(); 

    return true; 
} 

मुझे आशा थी कि ऐसा मौका था कि अन्यथा इस विशेष समस्या को हल कर चुके हैं। किसी भी जानकारी की सराहना की जाएगी। धन्यवाद।

उत्तर

6

पेलोड को संशोधित करना थोड़ा मुश्किल है। इस काम को करने का एकमात्र तरीका यह है कि getPayloadSource() और getPayloadResult() विधियों का उपयोग SoapBody पर करें, जो javax.xml.transform का खुलासा करते हैं-डेटा को कुशल बनाने के लिए मित्रवत वस्तुएं।

यह annoyingly हैवीवेट है, लेकिन आप कुछ इस तरह कर सकते हैं:

Transformer identityTransform = TransformerFactory.newInstance().newTransformer(); 
DOMResult domResult = new DOMResult(); 
identityTransform.transform(soapBody.getPayloadSource(), domResult); 

Node bodyContent = domResult.getNode(); // modify this 

identityTransform.transform(new DOMSource(bodyContent), soapBody.getPayloadResult()); 

मैं ऐसा करने का एक बेहतर तरीका है देखने के लिए अच्छा लगेगा।

+0

धन्यवाद। आप सही हैं - यह उम्मीद के रूप में सीधे आगे नहीं है। मैंने वास्तव में एक और फैशन में अपनी समस्या हल की। हालांकि यह मेरे मूल प्रश्न को सीधे संबोधित नहीं करता है - यह मेरी वर्तमान समस्या हल करता है। – Dave

1

मुझे एहसास हुआ कि बाद के बिंदु पर अनुरोध को बदलना आसान था। मुझे मूल SOAP संदेश को संशोधित करने की आवश्यकता नहीं थी, जब तक कि मैं अपने एंडपॉइंट पर पहुंचने से पहले डेटा को संशोधित करने में सक्षम था।

अंतराल मैं सभी के साथ काम कर रहा हूं AbstractDom4jPayloadEndpoint - इसलिए मैंने इन अंतराल को प्रॉक्सी में लपेट लिया जिसने मुझे मेरे एंडपॉइंट पर जाने से पहले अनुरोध तत्व को संशोधित करने की अनुमति दी। अर्थात्:

public class MyProxyEndpoint extends AbstractDom4jPayloadEndpoint 

    @Override 
    protected Element invokeInternal( 
     Element requestElement, 
     Document responseDocument) throws Exception 
    { 
     if(requestElement != null) 
     { 
      // alter request element 
     } 

     return (Element) this.invokeMethod.invoke( 
      this.target, 
      requestElement, 
      responseDocument); 
    } 
1

मैं सभी सोप शरीर अनुरोध में एक <authentication/> तत्व सम्मिलित करने के लिए इस सवाल का जवाब में कोड संशोधित:

@Override 
public boolean handleRequest(MessageContext messageContext) throws WebServiceClientException { 
    logger.trace("Enter handleMessage"); 
    try { 
     SaajSoapMessage request = (SaajSoapMessage) messageContext.getRequest(); 
     addAuthn(request); 
    } catch (Exception e) { 
     logger.error(e.getMessage(),e); 
    } 

    return true; 
} 

protected void addAuthn(SaajSoapMessage request) throws TransformerException { 
    Transformer identityTransform = TransformerFactory.newInstance().newTransformer(); 
    DOMResult domResult = new DOMResult(); 
    identityTransform.transform(request.getPayloadSource(), domResult); 

    Node bodyContent = domResult.getNode(); 
    Document doc = (Document) bodyContent; 
    doc.getFirstChild().appendChild(authNode(doc)); 

    identityTransform.transform(new DOMSource(bodyContent), request.getPayloadResult()); 
} 

protected Node authNode(Document doc) { 
    Element authentication = doc.createElementNS(ns, "authentication"); 
    Element username = doc.createElementNS(ns, "username"); 
    username.setTextContent(authn.getUsername()); 
    Element password = doc.createElementNS(ns, "password"); 
    password.setTextContent(authn.getPassword()); 
    authentication.appendChild(username); 
    authentication.appendChild(password); 
    return authentication; 
} 

यह समाधान क्योंकि WebServiceMessageCallback दस्तावेज़ को बदलने के लिए मुझे आवश्यकता होगी इस्तेमाल किया गया था, और SaajSoapMessageFactory को साबित किया गया है कि साबुन निकाय को कॉन्फ़िगर किया गया Jaxb2Marshaller द्वारा डाला गया है।

संबंधित मुद्दे