2010-02-03 11 views
14

के साथ सर्वर-साइड एक्सएमएल प्रमाणीकरण मैं अपाचे सीएक्सएफ webservice (एसएएपी पर जेएक्स-डब्ल्यूएस का उपयोग करके) पर काम कर रहा हूं। सेवा स्वयं बहुत सरल है: एक अनुरोध प्राप्त करें, डेटाबेस में अनुरोध डालें, और वापस डालें कि क्या सम्मिलन सफल हुआ था या नहीं। मैं अनुरोध पर कई बाधाओं को लागू करने के लिए एक्सएमएल सत्यापन पर भरोसा करना चाहता हूं।सीएक्सएफ वेबसाइट सेवा

तो, मेरा प्रश्न। मैं अपनी सेवा के ग्राहक को विस्तृत सत्यापन त्रुटियों को कैसे वापस कर सकता हूं? मैंने अपने एंडपॉइंट को कॉन्फ़िगर करके सर्वर-साइड पर सत्यापन चालू कर दिया है।

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <!-- This entry should- ideally- enable JAXB validation 
     on the server-side of our web service. --> 
     <entry key="schema-validation-enabled" value="true" /> 
    </jaxws:properties> 
</jaxws:endpoint> 

मैं सर्वर पर इंटरसेप्टर का उपयोग कर (जैसे BareInInterceptor), और किसी भी तरह पकड़ने SAXParseExceptions उन्हें लपेटो और उन्हें ग्राहक को साथ भेजा जाने का पता लगाया है। यह दृष्टिकोण थोड़ा जटिल लगता है, लेकिन अगर किसी XML को उनके XML अमान्य है तो मुझे किसी भी तरह से लाइन नंबर देने की आवश्यकता है। क्या मुझे अपवादों का पर्दाफाश करने के लिए इंटरसेप्टर के साथ जाना चाहिए?

मुझे इस तकनीक के ढेर के साथ बहुत अनुभवी नहीं है, और बस वेब सेवाओं में शामिल होना- किसी भी पॉइंटर्स जो आप मुझे दे सकते हैं वास्तव में सराहना की जाएगी।

+2

ध्यान रखें कि यदि आपके अनुरोध में एक्सएमएल एसओएपी क्लाइंट एप्लिकेशन (जैसे कि आप अपनी सेवा से स्टब्स उत्पन्न करने से प्राप्त करेंगे) द्वारा उत्पन्न किया जा रहा है, तो आपकी लाइन संख्या 1 बहुत बार होने की संभावना है (कई ग्राहक आसानी से 1-बहुत-लंबी लाइन XML दस्तावेज़ उत्पन्न करेंगे)। –

+0

@ इयान मैकलेयर: दूसरी तरफ, यह टेस्टर्स द्वारा आवेदन की जाने वाली वैध टिप्पणियां है, वे बेहतर प्रारूपण का उपयोग करते हैं और इससे उन्हें – Betlista

उत्तर

26

आप, मान्यता त्रुटि संदेश को ओवरराइड एक लाइन नंबर डालने, एक कस्टम ValidationEventHandler का उपयोग करके कर सकते हैं:

<jaxws:endpoint id="someEndpoint" implementor="#someImpl" address="/impl"> 
    <jaxws:properties> 
     <entry key="schema-validation-enabled" value="true" /> 
     <entry key="jaxb-validation-event-handler"> 
      <bean class="example.MyValidationEventHandler" /> 
     </entry> 
    </jaxws:properties> 
</jaxws:endpoint> 

तो फिर तुम मिल जाएगा:

package example; 

import javax.xml.bind.ValidationEvent; 
import javax.xml.bind.helpers.DefaultValidationEventHandler; 

public class MyValidationEventHandler extends DefaultValidationEventHandler {  
    @Override 
    public boolean handleEvent(ValidationEvent event) { 
     if (event.getSeverity() == ValidationEvent.WARNING) { 
      return super.handleEvent(event); 
     } else { 
      throw new RuntimeException(event.getMessage() 
       + " [line:"+event.getLocator().getLineNumber()+"]"); 
     } 
    } 
} 

आप इस हैंडलर का उपयोग करने के लिए अपने अंतिम बिंदु कॉन्फ़िगर करते हैं SOAP दोष जो इस तरह दिखते हैं:

<soap:Envelope xmlns:soap="http://schemas.xmlsoap.org/soap/envelope/"> 
    <soap:Body> 
     <soap:Fault> 
      <faultcode>soap:Client</faultcode> 
      <faultstring>Unmarshalling Error: Not a number: xyz [line: 6]</faultstring> 
     </soap:Fault> 
    </soap:Body> 
</soap:Envelope> 

जैक्सबी-सत्यापन-ev एंट-हैंडलर संपत्ति को हाल ही में सीएक्सएफ में हाल ही में जोड़ा गया था, इसलिए आपको यह सुनिश्चित करना होगा कि आप नवीनतम संस्करण का उपयोग कर रहे हैं - मैंने इसका परीक्षण 2.2.5 के साथ किया था।

+0

मदद मिलेगी, मैं इसे सुबह में आज़मा दूंगा! –

+0

यह बहुत अच्छा काम करता है, समुद्र- बक्षीस तुम्हारा है। –

+0

ऐसा लगता है कि यह दृष्टिकोण सीएक्सएफ 2.2.9 के लिए ठीक से काम नहीं कर रहा है। यह अभी भी मामले के लिए लाइन नंबर लौटाएगा, जब गलत तिथि मान निर्दिष्ट होगा, लेकिन लाइन नंबर गलत होगा। अन्य अपवादों के लिए, एफ.ई. स्ट्रिंग लम्बाई के लिए टूटा प्रतिबंध यह लाइन नंबर को जोड़ नहीं देगा, और initil SAXParseException वापस कर दिया जाएगा। इसलिए, जैसा कि मैं समझता हूं, एक तरीका है - दोषों को संभालने और दस्तावेज़ को दोबारा करने के लिए, जब SAXParseExceptions प्राप्त हुआ। – Milkywayfarer

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