2013-07-03 6 views
6

के लिए मान्य मान नहीं है मेरे पास POJO का ऑब्जेक्ट पेड़ है जो एक्सएमएल स्कीमा का प्रतिनिधित्व करता है। यह निम्नलिखित jaxb चींटी स्क्रिप्ट के साथ बनाया गया था।SAXParseException: मान 'दिनांक'

मैं विशेषताएं गुम लिए स्कीमा के खिलाफ जड़ POJO और उसके बच्चों संस्थाओं को मान्य करना चाहते हैं। (ट्राई/कैच छोड़े गए ब्लॉक, से प्रेरित अतः How to validate against schema in JAXB 2.0 without marshalling? सवाल)

public boolean validateAgainstSchema(Pojo pojo) 
{ 
     JAXBContext jc; 
     jc = JAXBContext.newInstance(Pojo.class); 
     SchemaFactory sf = SchemaFactory.newInstance(XMLConstants.W3C_XML_SCHEMA_NS_URI); 
     Schema schema = sf.newSchema(new ClassPathResource("schema.xsd").getFile()); 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setSchema(schema); 
     marshaller.marshal(schema, new DefaultHandler()); 
     return true; 
} 

मेरी विशेषताओं में से एक (pojo.childEntity.someAttribute) एक date

XSD

<xsd:attribute name="some_date" use="required"> 
    <xsd:simpleType> 
    <xsd:restriction base="xsd:date" /> 
    </xsd:simpleType> 
</xsd:attribute> 
:

मेरे कोड पीछा कर रहा है

जावा

@XmlAttribute(name = "someDate", required = true) 
protected XMLGregorianCalendar someDate; 

यह किसी अन्य POJO (जिसे हाइबरनेट के साथ मैप किया गया है) से java.util.Date ऑब्जेक्ट से पॉप्युलेट हो जाता है।

private static final XMLGregorianCalendar dateToCalendar(Date date) 
{ 
    if (date == null) 
     return null; 
    try 
    { 
     GregorianCalendar c = new GregorianCalendar(); 
     c.setTime(date); 

     return DatatypeFactory.newInstance() 
       .newXMLGregorianCalendar(c); 
    } 
    catch (DatatypeConfigurationException e) 
    { 
     e.printStackTrace(); 
     return null; 
    } 

} 

अपवाद है:

javax.xml.bind.MarshalException 
- with linked exception: 
[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '2001-05-11T00:00:00.000+02:00' is not a valid value for 'date'.] 

यह लग रहा है JAXB एक क्षेत्र है कि केवल तारीख करना चाहिए के लिए दोनों की तारीख और समय निर्धारित करने की कोशिश करता है, और XMLGregorianCalendard बस एक datetime कंटेनर है की तरह।

सवाल यह है कि: त्रुटि का कारण क्या है? कैसे ठीक करना है?

उत्तर

2

डिफ़ॉल्ट रूप से एक XMLGregorianCalendar संपत्ति के लिए उत्पादन कैसे आप इसे बनाने के आधार पर की जाएगी। यदि आप समय भाग को पॉप्युलेट करते हैं, तो समय का हिस्सा एक्सएमएल में आउटपुट होगा। आप को देखने के लिए क्या इसी एक्सएमएल प्रतिनिधित्व है getXMLSchemaType() विधि कॉल कर सकते हैं:

आप प्रतिनिधित्व ओवरराइड करने के लिए @XmlSchemaType एनोटेशन का उपयोग कर सकते हैं।

जावा मॉडल (रूट)

नीचे 3 XMLGregorianCalendar क्षेत्रों के साथ एक वस्तु है। तीसरे पर मैं स्कीमा प्रकार निर्दिष्ट करने के लिए @XmlSchemaType एनोटेशन का उपयोग करूंगा।

import javax.xml.bind.annotation.*; 
import javax.xml.datatype.XMLGregorianCalendar; 

@XmlRootElement 
@XmlAccessorType(XmlAccessType.FIELD) 
public class Root { 

    protected XMLGregorianCalendar default1; 

    protected XMLGregorianCalendar default2; 

    @XmlSchemaType(name="date") 
    protected XMLGregorianCalendar schemaTypeDate; 

} 

डेमो कोड

डेमो कोड के नीचे हम XMLGregorianCalendar के 2 उदाहरण बना होगा। एक में स्कीमा प्रकार date अन्य dateTime होगा। डिफ़ॉल्ट रूप से एक्सएमएल के लिए marshalling जब एक्सएमएल प्रतिनिधित्व इस्तेमाल किया जाता है। schemaTypeDate फ़ील्ड पर हम डिफ़ॉल्ट को ओवरराइड करने के लिए @XmlSchemaType एनोटेशन का उपयोग करेंगे।

import javax.xml.bind.*; 
import javax.xml.datatype.*; 

public class Demo { 

    public static void main(String[] args) throws Exception { 
     JAXBContext jc = JAXBContext.newInstance(Root.class); 

     DatatypeFactory df = DatatypeFactory.newInstance(); 
     XMLGregorianCalendar date = df.newXMLGregorianCalendar("2013-07-03"); 
     XMLGregorianCalendar dateTime = df.newXMLGregorianCalendar("1999-12-31T23:59:00"); 

     Root root = new Root(); 
     root.default1 = date; 
     root.default2 = dateTime; 
     root.schemaTypeDate = dateTime; 

     Marshaller marshaller = jc.createMarshaller(); 
     marshaller.setProperty(Marshaller.JAXB_FORMATTED_OUTPUT, true); 
     marshaller.marshal(root, System.out); 
    } 

} 

आउटपुट

<?xml version="1.0" encoding="UTF-8" standalone="yes"?> 
<root> 
    <default1>2013-07-03</default1> 
    <default2>1999-12-31T23:59:00</default2> 
    <schemaTypeDate>1999-12-31</schemaTypeDate> 
</root> 

अद्यतन

ठीक है, के बाद से मैं XmlGregorianCalendars की loooooooooooooooooooooooooooooooooots है वहाँ एक रास्ता XJC बताने के लिएजोड़ने के लिए हैxmlSchemaType सभी एक्सजीसी में विशेषता है?

JAXB जब स्कीमा प्रकार XML स्कीमा प्रकार अर्थात xsd:date या xsd:dateTime में निर्माण में से एक है, लेकिन आप इन प्रकारों में से एक विस्तार किया है जब नहीं आप के लिए यह कर देगा।

XML स्कीमा (schema.xsd)

<?xml version="1.0" encoding="UTF-8"?> 
<schema xmlns="http://www.w3.org/2001/XMLSchema"> 
    <complexType name="root"> 
     <sequence> 
      <element name="dateElement" type="date" /> 
      <element name="dateTimeElement" type="dateTime" /> 
      <element name="extendedDateElement"> 
       <simpleType> 
        <restriction base="date" /> 
       </simpleType> 
      </element> 
     </sequence> 
     <attribute name="dateAttribute" type="date" /> 
     <attribute name="dateTimeAttribute" type="dateTime" /> 
     <attribute name="extendedDateAttribute"> 
      <simpleType> 
       <restriction base="date" /> 
      </simpleType> 
     </attribute> 
    </complexType> 
</schema> 

रूट

@XmlAccessorType(XmlAccessType.FIELD) 
@XmlType(name = "root", propOrder = { 
    "dateElement", 
    "dateTimeElement", 
    "extendedDateElement" 
}) 
public class Root { 

    @XmlElement(required = true) 
    @XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar dateElement; 

    @XmlElement(required = true) 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar dateTimeElement; 

    @XmlElement(required = true) 
    protected XMLGregorianCalendar extendedDateElement; 

    @XmlAttribute(name = "dateAttribute") 
    @XmlSchemaType(name = "date") 
    protected XMLGregorianCalendar dateAttribute; 

    @XmlAttribute(name = "dateTimeAttribute") 
    @XmlSchemaType(name = "dateTime") 
    protected XMLGregorianCalendar dateTimeAttribute; 

    @XmlAttribute(name = "extendedDateAttribute") 
    protected XMLGregorianCalendar extendedDateAttribute; 

} 
+0

सत्य अधिक जटिल है (मैंने सोचा कि इससे कोई फर्क नहीं पड़ता): मैं –

+0

@ डीजेकेलॉन से ग्रेग कैलेंडर को पॉप्युलेट करता हूं - मैंने अपना जवाब अपडेट किया है जानकारी जो मदद करनी चाहिए। –

+0

ठीक है, क्योंकि मेरे पास XmlGregorianCalendars के loooooooooooooooooooooooooooooooooots है, XJC को सभी XGCs में xmlSchemaType विशेषता जोड़ने के लिए कहने का कोई तरीका है? –

0

तो तारीख है '2001-05-11T00: 00: 00.000 + 02: 00' का उपयोग

<xsd:restriction base="xsd:dateTime" /> 
+0

क्षमा करें। मैं स्कीमा नहीं बदल सकता। यह एक इंटरऑपरेबिलिटी प्रक्रिया में उपयोग की जाने वाली एक मानक स्कीमा है। स्कीमा स्वयं * होना चाहिए * लेकिन मैं इसके बारे में अधिक जानकारी का खुलासा नहीं करना चाहता हूं –

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