簡體   English   中英

JaxB 綁定 XMLGregorianCalendar

[英]JaxB binding XMLGregorianCalendar

JaxB 將不正確的日期格式綁定到 XMLGregorianCalendar 時不會引發異常。 相反,它分配 null。 可能是什么問題呢?

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

注意:我是EclipseLink JAXB (MOXy)負責人,也是 JAXB 2.X ( JSR-222 ) 專家組的成員。

這種行為在 JAXB 實現之間會略有不同。 例如,如果值不正確,MOXy 將拋出以下異常:

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)

解決方法

要在任何 JAXB 實現上報告錯誤,您可以在解組器上設置 XML 模式以執行驗證:

或者您可以自己實現一個XmlAdapter來控制轉換(並在必要時拋出異常):

也許這個鏈接對你有幫助:

http://eskatos.wordpress.com/2007/11/24/jaxb-custom-binding-for-joda-time/

它描述了使用自定義 Java 數據類型處理 XML 中的日期(此處:JodaTime)

使用它,它將捕獲異常:

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

更新:

添加代碼后,我不確定您將如何捕捉到這一點。 為此,我認為您需要進行 null 檢查並做任何您想做的事情。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM