如何让JAXB解析BigInteger的科学记数法?

对于JAXB和marhsalling / unmarshalling而言,我是一个新手,并且一直在努力实现我的实现.

到目前为止,我已经编写了我的XSD并使用xjc生成了我的POJO.一切正常.另外,当我需要解组以String数据或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,但我不明白如何使用它来看我正在看的情况.如果有人可以提供见解或示例(除了无处不在的地图示例,我一直在网上找到),我将非常感激.

谢谢!

埃里克

最佳答案 1)没有自定义绑定,NO,因为XML Schema规范很清楚
lexical representation of a decimal是什么.

2)我认为定制是解决这个问题的唯一方法; another way maybe

我会担心的是,如果有人试图使用生成的XSD来验证实例XML,那么现在会失败,除非你有一个允许两者的模式……虽然shunned,xsd:union可能是唯一的出路(你仍然需要做一个自定义绑定)…

点赞