2013-07-03 26 views
6

Bir XML şemasını temsil eden bir POJO nesnesi ağacım var. Bu, aşağıdaki jaxb ant komut dosyasıyla oluşturuldu. SAXParseException: value 'date' için geçerli bir değer değil

Ben özelliklerini eksik şemayla kök POJO ve alt öğeleri varlıkları doğrulamak istiyorum. (Deneyin/SO How to validate against schema in JAXB 2.0 without marshalling? sorgulamaya esinlenerek ihmal catch bloğu,) benim niteliklerin

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

One (pojo.childEntity.someAttribute) bir date

XSD

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

Kodum şudur

Java

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

java.util.Date nesnesinden başka bir POJO'dan (Hazırda bekletme ile eşlenen) gelen bir nesne alır.

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

} 

istisnadır: JAXB yalnızca tarihi taşıması gerekir bir alan için hem tarih ve saati ayarlamak çalışır ve XMLGregorianCalendard basitçe bir datetime konteyner bu görünüyor

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

.

Soru şudur: hatanın nedeni nedir? Nasıl düzeltilir? tarih ise

cevap

2

kullanın. Zaman bölümünü doldurursanız, zaman kısmı XML'e gönderilir. Sen gelen XML temsilidir ne olduğunu görmek için getXMLSchemaType() yöntemini çağırabilirsiniz:

Sen temsilini geçersiz kılmak için @XmlSchemaType ek açıklama kullanabilirsiniz.

Java Modeli (kök)

altında 3 XMLGregorianCalendar alanlar ile bir amacıdır. 3'te şema tipini belirtmek için @XmlSchemaType ek açıklama kullanacağım.

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; 

} 

biz XMLGregorianCalendar 2 örneklerini oluşturur Aşağıdaki demo kodunda Demo Kod

. Birisi date diğer dateTime şema türüne sahip olacaktır. Varsayılan olarak, XML'e sıralanırken kullanılan XML gösterimi budur. schemaTypeDate alanında, varsayılanı geçersiz kılmak için @XmlSchemaType ek açıklamasını kullanacağız.

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

} 

Çıktı

<?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> 

GÜNCELLEME,

Tamam ben XmlGregorianCalendars ait loooooooooooooooooooooooooooooooooots berieklemek için XJC anlamanın bir yolu yoktur Tüm XGC'lerexmlSchemaType özniteliği? şema tipi yani xsd:date veya xsd:dateTime XML Şema türlerinde yapı biri olduğunda, ancak bu tiplerden biri artırdık değilken

JAXB sizin için yapacaktır.

XML Şeması (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> 

Kök

@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

Gerçek daha karmaşık (farketmediğini düşündüm): GregCalendar'u bir Tarih'ten aldım –

+0

@djechelon - Cevabımı güncelledim yardımcı olması gereken bilgiler. –

+0

Tamam, ben XmlGregorianCalendars loooooooooooooooooooooooooooooooooots var XJC tüm XGCs xmlSchemaType özniteliği eklemek için bir yol var mı? –

0

': 00: 2001-05-11T00 00.000 + 02: 00' bir XMLGregorianCalendar özellik için çıkış oluşturduktan nasıl dayanacaktır Varsayılan olarak

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

üzgünüm. Şemayı değiştiremiyorum. Birlikte çalışabilirlik sürecinde kullanılan standart bir şemadır. Şemanın kendisi * açık olmalı * ama bu konuda daha fazla bilgi açıklamamayı tercih ediyorum –

İlgili konular