JAXB编组使用参数fractionDigits的BigDecimal(JAXB marshalli

2019-07-19 19:43发布

因此,这里是我的问题。 我给它我生成的XML文件应遵守的XSD。 使用org.apache.cxf.cxf-xjc-plugin maven插件和外部结合文件I生成的源代码。 但是,当我试图马歇尔我的对象生成的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如有更改,我想离开这个生成的源代码不变。

Answer 1:

您将需要使用XmlAdapter这个用例。 下面是一个示例绑定文件,这将帮助你生成它们。 该逻辑将被包含在一个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>

欲获得更多信息

  • http://blog.bdoughan.com/2011/08/xml-schema-to-java-generating.html


Answer 2:

如果你可以改变使用的XSD precisionDecimal文件类型在这里你也许可以使用minScalemaxScale方面设置为相同的值。



Answer 3:

我很困惑,怎么可能通过维持尾随零来获得。

如果尾随零是很重要的保留,然后用一个字符串值,而不是一些和使用属性来指定其宽度和小数。

在任何情况下,尾随零将永远不会影响任何使用这些值的计算,你就可以将它们的唯一方法是通过转换结果成一个字符串和自己填充它。 对于一些帮助这样做,你可能想看看...

CXF客户端SOAP消息格式



Answer 4:

我已经创造了一些特殊的XmlAdapter,例如

public class BigDecimal8PlaceAdapter extends XmlAdapter<String, BigDecimal> {

@Override
public String marshal(BigDecimal v) throws Exception {
  DecimalFormatSymbols otherSymbols = new DecimalFormatSymbols();
  otherSymbols.setDecimalSeparator('.');
  DecimalFormat df = new DecimalFormat("#0.00000000",otherSymbols);
  return df.format(v);
}

@Override
public BigDecimal unmarshal(String v) throws Exception {
    Double d = Double.valueOf(v);
    return BigDecimal.valueOf(d);
}

}

然后我加入XmlAdapter的属性:

@XmlElement(name = "rate", required = true)
@XmlJavaTypeAdapter(BigDecimal8PlaceAdapter.class)
protected BigDecimal rate;

然后,做2位小数adapeter同样的事情。



文章来源: JAXB marshalling for BigDecimal using fractionDigits