【问题标题】:How to make JAXB parse scientific notation for BigInteger?如何让 JAXB 解析 BigInteger 的科学记数法?
【发布时间】:2012-02-22 14:16:49
【问题描述】:

在 JAXB 和编组/解组方面我是个新手,并且一直在努力通过我的实现来让事情正常进行。

到目前为止,我已经编写了 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'.]

在使用“十进制”类型或必须为“双精度”时,有什么方法可以正确解析科学记数法吗?

最初,我认为我可以使用双精度表示,因为双精度可以解析科学记数法,但是,我正在处理财务值(这是用于银行计算),因此,我意识到使用双精度表示会导致舍入错误它的固有局限性。

所以我想问题变成了如何创建自定义绑定,让我能够解析科学记数法并将数据存储在 BigDecimal 中?我看过XMLAdpater,但我不明白如何将它用于我正在查看的案例。如果有人能提供见解或示例(除了我一直在网上找到的无处不在的地图示例),我将不胜感激。

谢谢!

埃里克

【问题讨论】:

    标签: java xsd jaxb schema


    【解决方案1】:

    1) 没有自定义绑定,否,因为 XML Schema 规范非常清楚 lexical representation of a decimal 是什么。

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

    不过,我担心的是,如果有人试图使用生成的 XSD 来验证实例 XML,除非你有一个允许两者的架构,否则会时不时地失败......虽然 shunned, xsd :union 可能是唯一的出路(您仍然需要进行自定义绑定)...

    【讨论】:

    • 我有点期待。经过进一步思考,我意识到在内部将数据存储为 double 甚至行不通,所以我肯定需要自定义工作,但不确定这到底意味着什么。我认为它正在使用 XMLAdapter,但不确定。
    猜你喜欢
    • 2010-10-12
    • 2023-02-21
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2017-04-05
    • 1970-01-01
    相关资源
    最近更新 更多