2013-07-03 2 views
6

XML 스키마를 나타내는 POJO 객체 트리가 있습니다. 이것은 다음 jaxb 개 스크립트로 생성되었습니다. SAXParseException : 값이 'date'의 유효한 값이 아님

나는 속성이 누락 된 스키마에 대한 루트 POJO와 자식 개체의 유효성을 검사합니다. (시도/SO How to validate against schema in JAXB 2.0 without marshalling? 질문에서 영감을 생략 catch 블록) 내 속성의

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; 
    } 

} 

예외는 다음과 같습니다 JAXB는 날짜를 수행해야 필드에 모두 날짜와 시간을 설정하려고하고 XMLGregorianCalendard 단순히 날짜 컨테이너처럼이 보이는

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'.] 

.

질문 : 오류의 원인은 무엇입니까? 어떻게 고치는 지? 날짜 인 경우

답변

2

를 사용합니다. 시간 부분을 채우면 시간 부분이 XML로 출력됩니다. 당신은 해당 XML 표현이 무엇인지 확인하기 위해 getXMLSchemaType() 메소드를 호출 할 수 있습니다

당신은 표현을 대체 할 @XmlSchemaType 주석을 사용할 수 있습니다.

자바 모델 (루트)

다음은 3 개 XMLGregorianCalendar 필드 개체입니다. 3 번째에서는 @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의 두 인스턴스를 생성합니다 아래의 데모 코드에서 데모 코드

. 하나는 스키마 유형 date이고 다른 하나는 dateTime입니다. 기본적으로 이것은 XML에 마샬링 할 때 사용되는 XML 표현입니다. 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> 

UPDATE,

좋아 내가 XmlGregorianCalendars의 loooooooooooooooooooooooooooooooooots이 이후,745을 추가 XJC을 알 수있는 방법이모든 XGC에 대한 xmlSchemaType 속성? 스키마 유형 즉 xsd:date 또는 xsd:dateTime XML 스키마 유형에 빌드 중 하나입니다 때,하지만 당신은 이러한 유형 중 하나를 확장하지 않았을 때

JAXB는 당신을 위해 이것을 할 것입니다.

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

진실은 더 복잡합니다 (나는 중요하지 않다고 생각했습니다) : 날짜에서 GregCalendar를 채 웁니다. –

+0

@djechelon - 나는 내 대답을 업데이트했습니다. 도움이되는 정보. –

+0

좋아, 이후 xoooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooooo 여기서 모든 XGCs에 xmlSchemaType 특성을 추가하려면 XJC 알리는 방법은 있습니까? –

0

': 00 : 2001-05-11T00 00.000는 + 02 : 00'은 XMLGregorianCalendar 속성에 대한 출력이 당신이 그것을 만드는 방법을 기반으로합니다 기본적으로

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

죄송합니다. 스키마를 변경할 수 없습니다. 상호 운용성 프로세스에서 사용되는 표준 스키마입니다. 스키마 자체가 공개되어야하지만 그것에 대해 더 많은 정보를 공개하지 않는 것이 좋습니다 –

관련 문제