2011-07-14 69 views
4

JaxB将不正确的日期格式绑定到XMLGregorianCalendar时不引发异常。相反,它分配空值。可能是什么问题呢?JaxB绑定XMLGregorianCalendar

@XmlAttribute(name = "travelEndDate", required = true) 
@XmlSchemaType(name = "date") 
protected XMLGregorianCalendar travelEndDate; 

<xs:complexType name="SearchCriteria"> 
<xs:attribute name="travelStartDate" type="xs:date" use="required"/> 
<xs:attribute name="travelEndDate" type="xs:date" use="required"/> 
</xs:complexType> 

回答

4

注:我是EclipseLink JAXB (MOXy),并且是JAXB 2.X(JSR-222)专家组的成员。

这种行为在JAXB实现之间会有所不同。莫西例如会引发以下异常,如果该值不正确:

Exception in thread "main" javax.xml.bind.UnmarshalException 
- with linked exception: 
[Exception [EclipseLink-3003] (Eclipse Persistence Services - 2.4.0.qualifier): org.eclipse.persistence.exceptions.ConversionException 
Exception Description: Incorrect date format: [2011-02-50] (expected [YYYY-MM-DD])] 
    at org.eclipse.persistence.jaxb.JAXBUnmarshaller.unmarshal(JAXBUnmarshaller.java:225) 
    at forum254.Demo.main(Demo.java:18) 
Caused by: Exception [EclipseLink-3003] (Eclipse Persistence Services - 2.4.0.qualifier): org.eclipse.persistence.exceptions.ConversionException 
Exception Description: Incorrect date format: [2011-02-50] (expected [YYYY-MM-DD]) 
    at org.eclipse.persistence.exceptions.ConversionException.incorrectDateFormat(ConversionException.java:103) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertStringToXMLGregorianCalendar(XMLConversionManager.java:689) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObjectToXMLGregorianCalendar(XMLConversionManager.java:278) 
    at org.eclipse.persistence.internal.oxm.XMLConversionManager.convertObject(XMLConversionManager.java:249) 
    at org.eclipse.persistence.oxm.XMLField.convertValueBasedOnSchemaType(XMLField.java:712) 

解决方法

为了让报道上,你可以在执行验证解组设置一个XML架构进行任何JAXB实现一个错误:

或者你可以实现一个XmlAdapter来控制转换(如有必要抛出一个异常)自己:

0

利用这一点,就会捕捉到了异常:

try { 
    String date = "your date here" 
    XMLGregorianCalendar xmlGCal = DatatypeFactory.newInstance().newXMLGregorianCalendar(date); 
    } catch (DatatypeConfigurationException ex) { 
     //DO STUFF 
     } 

更新:

您添加代码后,我不知道你将如何抓住这个。为此,我认为你需要做一个空检查并做你想做的事情。