2012-01-30 23 views
4

我是一個新手,當涉及到JAXB和marhsalling/unmarshalling,並一直在努力通過我的實現工作。如何讓JAXB解析BigInteger的科學記數法?

到目前爲止,我寫了我的XSD並使用xjc生成了我的POJO。所有的工作正常。此外,當我需要取消編入作爲字符串數據或w3c文檔的數據時,我使用JAXBContext.generateSchema()來生成與我正在接收的預期類相關的匹配模式。所有這一切都很好。

當我分析generateSchema()產生的模式時,我的問題就出現了。根據JAXB docs,BigDecimal生成爲xsd十進制類型。

我的輸入有時包含科學記數法(例如:1.12E12)。當我嘗試解組與由JAXB生成的架構,我得到一個javax.xml.bind.UnmarshalException例外:

[org.xml.sax.SAXParseException: cvc-datatype-valid.1.2.1: '1.32400146520976E-4' is not a valid value for 'decimal'.] 

是否有某種方式使用「十進制」型或必須在正確地解析科學記數法它是「雙」?

最初,我以爲我可以使用雙重表示法,因爲double可以解析科學記數法,但是,我正在處理財務值(這是用於銀行計算),因此,我意識到使用雙重表示會導致舍入錯誤由於它固有的限制。

所以我想問題是如何創建自定義綁定,這將允許我解析科學記數法並將數據存儲在BigDecimal中?我已經看過XMLAdpater,但我不明白如何將它用於我正在查看的情況。如果任何人都可以提供見解或示例(除了我在網上發現的無處不在的Map示例之外),我將不勝感激。

謝謝!

埃裏克

回答

2

1)在不自定義綁定,NO,因爲XML模式規範是什麼lexical representation of a decimal是相當清楚的。

2)我會認爲定製是克服這一點的唯一方法; another way maybe

我會擔心的是,如果有人會試圖使用生成的XSD來驗證實例XML,那麼現在將會失敗,除非您有一個允許這兩種模式的架構......儘管shunned,xsd:工會可能是唯一的出路(你仍然必須做一個自定義綁定)...

+0

我有點期待。經過進一步的思考,我意識到將內部數據存儲爲雙精度數據甚至不可行,所以我絕對需要定製工作,但不確定究竟是什麼。我認爲*它使用XMLAdapter,但不確定。 – 2012-01-30 20:19:13