2012-12-08 18 views
20
<xs:element name="age"> 
    <xs:simpleType> 
    <xs:restriction base="xs:integer"> 
     <xs:minInclusive value="0"/> 
     <xs:maxInclusive value="120"/> 
    </xs:restriction> 
    </xs:simpleType> 
</xs:element> 

तो मैं इसे इस तरह जावा कोड में बदला प्राप्त करना चाहते हैं:क्या JAXB xsd का समर्थन करता है: प्रतिबंध?

public void setAge(int age){ 
    if(age < 0 || age > 120){ 
     //throw some exception 
    } 
    //setting the age as it is a valid value 
} 

यह JAXB में संभव है?

कुछ वेब सेवा क्लाइंट स्टब जेनरेटर को शायद यह axis2 webservice कर रहा था लेकिन यकीन नहीं था।

उत्तर

18

JAXB (JSR-222) विनिर्देश डोमेन मॉडल में तेजी से तर्क असफल पैदा करने को कवर नहीं करता। एक आम अभ्यास अब एनोटेशन (या एक्सएमएल) के रूप में सत्यापन नियमों को व्यक्त करना और उन पर सत्यापन चलाने के लिए है। Bean Validation (JSR-303) इसे मानकीकृत करता है और किसी भी जावा ईई 6 कार्यान्वयन में उपलब्ध है।

XJC एक्सटेंशन

मैं अपने आप को प्रयास नहीं किया है निम्न एक्सटेंशन लेकिन ऐसा लगता है जैसे कि यह XML स्कीमा से डोमेन मॉडल प्रतिनिधित्व सत्यापन नियमों पर Bean Validation (JSR-303) एनोटेशन उत्पन्न होगा। चूंकि एक्सजेसी बहुत एक्स्टेंसिबल है, इसलिए अन्य प्लग-इन भी उपलब्ध हो सकते हैं।

+1

धन्यवाद और एक और बात है। JAXB Facets के लिए एक [http://java.net/jira/browse/JAXB-917] जेआईआरए है, यह जेएक्सबी के लिए जेएसआर में शामिल नहीं है। सही? क्या यह कुछ अन्य मानक के कुछ मानक कार्यान्वयन है? –

+2

@ नरेंद्रपाथाई - यह पहला है जिसे मैंने जेएक्सबी फैक्स के बारे में सुना है। यह वर्तमान में जेएसआर का हिस्सा नहीं है और इसे जेएक्सबी संदर्भ कार्यान्वयन में वृद्धि के रूप में प्रस्तावित किया जा रहा है। मैंने जेरा मुद्दे पर बीन सत्यापन (जेएसआर -303) के साथ इसकी संगतता के बारे में पूछने पर एक टिप्पणी पोस्ट की है। एक जेएसआर -303 संगत दृष्टिकोण कुछ ऐसा होगा जो JAXB विनिर्देश के भविष्य के संस्करण में समर्थित हो सकता है। –

+1

धन्यवाद ब्लेज़। मैं आपके ब्लॉग का पालन करता हूं और जेएक्सबी में इसके कुछ कार्यान्वयन के बारे में सुनना पसंद करूंगा। –

4

जेएक्सबी में यह सत्यापन करने का सुझाया गया तरीका मार्शलर रेस पर स्कीमा सत्यापन पर स्विच कर रहा है। unmarshaller:

SchemaFactory schemaFactory = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
Schema schema = schemaFactory.newSchema(...); 

ValidationEventHandler valHandler = new ValidationEventHandler() { 
    public boolean handleEvent(ValidationEvent event) { 
     ... 
    } 
}; 

marshaller.setSchema(schema); 
marshaller.setEventHandler(valHandler); 
+0

मुझे पता है, लेकिन अगर स्कीमा XSD शामिल हैं: प्रतिबंध तब उत्पन्न कोड उन बाध्यताओं का –

+1

ठीक है, JAXB मानक और आरआई में इस तरह का कोई तंत्र नहीं है प्रतिबिंबित नहीं करता। मुझे लगता है कि उनका उपयोग नहीं किया जाता है क्योंकि सभी स्कीमा बाधाओं को तुरंत सत्यापित नहीं किया जा सकता है (उदाहरण के लिए "minOccurs = 2")। – Drunix

+0

लेकिन जैसा कि मैंने इस प्रश्न में उल्लेख किया है, कुछ अक्ष उपकरण बनाते हैं जो कक्षाएं उत्पन्न करते हैं जो xs: प्रतिबंध का उपयोग करते हैं। –

4

आप JAXB-Facets कोशिश कर सकते हैं। त्वरित टुकड़ा:

class MyClass { 

    @MinOccurs(1) @MaxOccurs(10) 
    @Facets(minInclusive=-100, maxInclusive=100) 
    public List<Integer> value; 

    @Facets(pattern="[a-z][a-z0-9]{0,4}") 
    public String name; 

}