SAXParseException: der Wert ist kein Gültiger Wert für 'Datum'
Habe ich ein Objekt-Baum von POJOs, stellt ein XML-Schema. Dies wurde mit den folgenden jaxb
ant-Skript.
Möchte ich überprüfen das root-POJO und seine Kinder, Personen, die gegen das schema für die fehlenden Attribute an.
Mein code ist der folgende: (try/catch-block weggelassen, inspiriert durch SO Frage Wie Validierung gegen schema bei JAXB 2.0 ohne 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;
}
Eines meiner Attribute (pojo.childEntity.someAttribute
) ist ein 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;
Wird es bevölkern, von einem java.util.Date
Objekt aus einem anderen POJO (wird abgebildet mit Hibernate).
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;
}
}
Ausnahme ist:
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'.]
Dieser sieht aus wie JAXB versucht, um sowohl das Datum und die Zeit für ein Feld, das sich tragen muss nur das Datum, und XMLGregorianCalendard ist einfach eine datetime-container.
Die Frage ist: was verursacht den Fehler? Wie zu beheben?
InformationsquelleAutor usr-local-ΕΨΗΕΛΩΝ | 2013-07-03
Du musst angemeldet sein, um einen Kommentar abzugeben.
Standardmäßig wird die Ausgabe für eine
XMLGregorianCalendar
Eigenschaft basiert auf, wie Sie es schaffen. Wenn Sie füllen Sie die Zeit Teil, dann den Teil der bei der Ausgabe in XML. Sie können rufen Sie diegetXMLSchemaType()
Methode, um zu sehen, was die entsprechende XML Repräsentation ist:Können Sie die
@XmlSchemaType
annotation überschreiben der Darstellung.Java-Modell (Root)
Unten ist ein Objekt mit 3
XMLGregorianCalendar
Felder. Auf dem 3. werde ich ein@XmlSchemaType
Anmerkung geben Sie den schema-Typ.Demo-Code
In der demo code unten wir erstellen 2 Instanzen von
XMLGregorianCalendar
. Eine schema-Typdate
den anderendateTime
. Standardmäßig ist die XML-Darstellung verwendet, wenn marshalling in XML. Auf derschemaTypeDate
Feld verwenden wir die@XmlSchemaType
annotation um die Standardeinstellung zu überschreiben.Ausgabe
UPDATE
JAXB wird dies für Sie tun, wenn die schema-Typ ist eine der build-in XML Schema Typen, d.h.
xsd:date
oderxsd:dateTime
, aber nicht, wenn du verlängert einer dieser Typen.XML-Schema (Schema.xsd)
Root
Ich aktualisiert meine Antwort mit Informationen, die helfen sollen.
Ok, da habe ich loooooooooooooooooooooooooooooooooots von XmlGregorianCalendars gibt es eine Möglichkeit zu sagen, XJC, fügen Sie die xmlSchemaType-Attribut, um alle XGCs?
Die
@XmlSchemaType
Anmerkungen sollte bereits für Sie Hinzugefügt (waren Sie?). Die Implementierung und version von JAXB verwenden Sie? Wenn Sie mit der JAXB im JDK, die version des JDK benutzt du?Eigentlich fand ich, dass mein root-entity war kommentiert, aber ein Kind von ihm (wirft den Fehler) war es nicht. Ich bin auf der Suche, um zu bestätigen, ob die XSD ist wirklich öffentlichkeit, so zumindest ich werde in der Lage sein zu verknüpfen.
InformationsquelleAutor Blaise Doughan
Wenn das Datum '2001-05-11T00:00:00.000+02:00' verwenden
InformationsquelleAutor Evgeniy Dorofeev