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

标签 java xsd jaxb schema

当涉及到 JAXB 和编码/解码时,我是一个新手,并且一直在努力完成我的实现以使事情正常工作。

到目前为止,我已经使用 xjc 编写了我的 XSD 并生成了我的 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 ”时,是否有某种方法可以正确解析科学记数法?

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

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

谢谢!

埃里克

最佳答案

1) 没有自定义绑定(bind),不,因为 XML 模式规范非常清楚 lexical representation of a decimal 是什么是。

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

但我会担心的是,如果有人试图使用生成的 XSD 来验证实例 XML,那会时不时地失败,除非您有一个允许两者的模式...虽然 shunned , xsd:union 可能是唯一的出路(您仍然必须进行自定义绑定(bind))...

关于java - 如何让 JAXB 解析 BigInteger 的科学记数法?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9069765/

相关文章:

xml - xsd id 的使用以及 id 和 name 之间的区别

编译依赖于多个模块的模块时,Maven Jaxb 生成失败

java - 使用 xjc 从多个 xsd 文件生成 Java

java - 在 java 中,抽象方法可以是 public 以外的任何东西吗?

java - 在底层组件上触发鼠标事件

java - JAXB、XSD 样式表和元素名称冲突解决

java - 我如何在 jaxb 中解码并在不使用显式模式文件的情况下享受模式验证

java - 为什么以及何时使用 AtomicIntegerFieldUpdater?

java - 如何从 Fragment Dialog 更新自定义 RecyclerView?

java - 从 XSD 将命名空间添加到 XML