Ho un albero di oggetti di POJO che rappresenta uno schema XML. Questo è stato creato con il seguente script ant jaxb
.SAXParseException: value non è un valore valido per 'date'
voglio convalidare il POJO radice e dei suoi bambini entità contro lo schema per gli attributi mancanti.
Il mio codice è il seguente: (provate/blocco catch omesso, ispirato domanda SO 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;
}
Uno dei miei attributi (pojo.childEntity.someAttribute
) è un date
XSD
<xsd:attribute name="some_date" use="required">
<xsd:simpleType>
<xsd:restriction base="xsd:date" />
</xsd:simpleType>
</xsd:attribute>
Java
@XmlAttribute(name = "someDate", required = true)
protected XMLGregorianCalendar someDate;
Viene popolato da un oggetto java.util.Date
da un altro POJO (uno mappato con Ibernazione).
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;
}
}
L'eccezione è:
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'.]
Questo appare come JAXB cerca di impostare sia la data e l'ora per un campo che deve portare solo la data, e XMLGregorianCalendard è semplicemente un contenitore datetime.
La domanda è: cosa causa l'errore? Come risolvere?
La verità è più complessa (pensavo che non fosse importante): popolo GregCalendar da una data –
@djechelon - Ho aggiornato la mia risposta con informazioni che dovrebbero aiutare. –
Ok, dato che ho loooooooooooooooooooooooooooooooooots di XmlGregorianCalendars c'è un modo per dire a XJC di aggiungere l'attributo xmlSchemaType a tutti gli XGC? –