2013-01-08 112 views
2

我試圖將現有應用程序的Java JDK版本從Java 5更改爲Java 6(更新38)。應用程序使用一些JAXB生成的類來封送/解組我們從遠程服務器發送/接收的XML。 XML符合架構(.xsd)文件。從Java 5 SE遷移到Java 6後,JAXB'date'轉換失敗SE

這一切都用於在Java 5下正常工作,並在類路徑中下載了一組JAXB二進制文件。我不確定下載的JAXB二進制文件的版本是什麼(這個項目已經在我面前了)。如果我只是改變從Java 5的JDK版本的Java 6(更新38),然後我得到了幾個單元測試失敗之前從未發生過,如:

[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '2012-08-22T00:00:00-04:00' is not a valid value for 'date'.] 

我想我或許可以解決這個通過將Java 6 JDK移動到類路徑的頭部,以便在外部JAXB二進制文件之前找到它。這產生編譯時錯誤,如:

The attribute required is undefined for the annotation type XmlElementRef 

報上我的JAXB生成的類的一個此錯誤(基於.xsd文件)。錯誤是由以下注釋行引起的:

@XmlElementRef(name = "DealCalendarId", type = JAXBElement.class, required = false) 

所以,我不確定接下來我需要做什麼。我有一些想法:

  • 刪除下載的JAXB二進制文件,並僅依賴於Java 6 SE中的內置JAXB支持(但我似乎記得前段時間這不適用於某個項目......)
  • 換上新版本
  • 下載JAXB二進制文件的新版本替換下載JAXB二進制文件,並把Java 6的JDK後,他們在classpath
  • 執行上述之一,也是再生我的所有JAXB類這是基於.xsd

有什麼建議嗎?

回答

3

問題#1

[org.xml.sax.SAXParseException:CVC-數據類型-valid.1.2.1: '2012-08-22T00:00:00-04:00'是不是「約會」的有效值。]

只有此消息2012-08-22T00:00:00-04:00去是不是對XML Schema的date類型的有效值,有效值是2012-08-22沒有時間信息。您提供的值將對應於dateTime類型。您使用的其他版本可能只是不想執行此驗證。

問題2:

所需的屬性是未定義註釋類型 XmlElementRef將

Java SE 6中包含了JAXB 2.1,則必須使用JAXB 2.2的Java SE 5已經其中@XmlElementRef註釋包含required屬性。

+1

非常感謝您花時間幫助我Blaise。我明天會在辦公室檢查這些。 –

+0

兩種情況都正確。我不確定爲什麼舊版本的JAXB允許將這些時間戳解除爲xs:date,但它確實如此。我修復了我的單元測試數據,刪除了時間部分,一切都很好。我下載了當前的JAXB版本(版本2.2.6),它似乎工作正常。再次感謝! –

+0

我相信你有一個綁定文件,它在datetime XML數據類型上創建了一個適配器,我只是刪除它,然後再次生成JAXB類,java數據類型從Date轉換爲XMLGregorianType。 –