java - 使用 fractionDigits 为 BigDecimal 进行 JAXB 编码

标签 java xsd jaxb xjc cxf-xjc-plugin

所以这是我的问题。我得到了一个 XSD,我生成的 XML 文件应符合该 XSD。使用 org.apache.cxf.cxf-xjc-plugin maven 插件和外部绑定(bind)文件生成源代码。但是当我尝试编码我的对象时,生成的 XML 不符合我的要求。

我的 XSD 包含以下内容:

<xsd:element maxOccurs="1" minOccurs="0" name="amount">
  <xsd:simpleType>
    <xsd:restriction base="xsd:decimal">
      <xsd:totalDigits value="13" />
      <xsd:fractionDigits value="2" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
...
<xsd:element maxOccurs="1" minOccurs="0" name="rate">
  <xsd:simpleType>
    <xsd:restriction base="xsd:decimal">
      <xsd:totalDigits value="8" />
      <xsd:fractionDigits value="5" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>

生成的 XML 片段如下所示:

<amount>109.5</amount>
...
<rate>10.25</rate>

虽然我期待它是:

<amount>109.50</amount>
...
<rate>10.25000</rate>

有没有办法以干净的方式解决这个问题?

我不想为每个 totalDigitsfractionDigits 组合编写多个适配器。由于 XSD 可能会发生变化,因此我希望保持生成的源代码不变。

最佳答案

对于此用例,您需要使用 XmlAdapter。下面是一个示例绑定(bind)文件,可帮助您生成它们。该逻辑将包含在 DecimalFormatter 类中,该类包含所有不同的所需格式的方法。

<jxb:bindings xmlns:xs="http://www.w3.org/2001/XMLSchema"
    xmlns:jxb="http://java.sun.com/xml/ns/jaxb" version="2.1">
    <jxb:bindings schemaLocation="schema.xsd">
        <jxb:bindings node="//xs:element[@name='amount']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType name="java.math.BigDecimal"
                        parseMethod="org.example.DecimalFormatter.parseDecimal"
                        printMethod="org.example.DecimalFormatter.printDecimal_2Places" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
        <jxb:bindings node="//xs:element[@name='rate']">
            <jxb:property>
                <jxb:baseType>
                    <jxb:javaType name="java.math.BigDecimal"
                        parseMethod="org.example.DecimalFormatter.parseDecimal"
                        printMethod="org.example.DecimalFormatter.printDecimal_5Places" />
                </jxb:baseType>
            </jxb:property>
        </jxb:bindings>
    </jxb:bindings>
</jxb:bindings>

了解更多信息

关于java - 使用 fractionDigits 为 BigDecimal 进行 JAXB 编码,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14848776/

相关文章:

java - 将 JSON 对象映射到 Hibernate 实体

xml - 在 xml 中混合 mininclusive 和枚举

xml - 是否可以从XPath值列表和XML XSD构建XML文档?

java - 通过 JAXB 解析 XML 的可选命名空间

java - 代表堆栈的单链表

Java 为什么没有读取 "Set-Cookie" header ?

xml - 错误: The element has a type attribute as well as an anonymous child type

java.lang.VerifyError : Expecting a stackmap frame at branch target JDK 1. 7

java - 向客户端返回 Web 服务响应?

java - 计算两点之间地理距离的更快方法