Java 使用fractionDigits对BigDecimal进行JAXB编组

Java 使用fractionDigits对BigDecimal进行JAXB编组,java,xsd,jaxb,xjc,cxf-xjc-plugin,Java,Xsd,Jaxb,Xjc,Cxf Xjc Plugin,这就是我的问题。我得到了一个XSD,生成的XML文件应该符合这个XSD。使用org.apache.cxf.cxfxjc插件maven插件和外部绑定文件生成源代码。但是当我试图对我的对象进行marshall时,生成的XML不符合我的要求 我的XSD包含以下内容: ... 生成的XML如下所示: 109.5 ... 10.25 当我期待它是: 109.50 ... 10.25000 有没有办法以干净的方式解决这个问题 我不希望为每个totalDigits,fractionDigits组合编写

这就是我的问题。我得到了一个XSD,生成的XML文件应该符合这个XSD。使用
org.apache.cxf.cxfxjc插件
maven插件和外部绑定文件生成源代码。但是当我试图对我的对象进行marshall时,生成的XML不符合我的要求

我的XSD包含以下内容:


...
生成的XML如下所示:

109.5
...
10.25
当我期待它是:

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


我不希望为每个
totalDigits
fractionDigits
组合编写多个适配器。由于XSD可能会更改,我想保留生成的源代码不变。

如果您可以将XSD更改为使用所记录的
precisionDecimal
类型,您可能可以使用
minScale
maxScale
facets设置为相同的值。

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


了解更多信息


我不清楚通过保持后面的零可以得到什么

如果尾部的零非常重要,需要保留,则使用字符串值而不是数字,并使用属性指定其宽度和小数

在任何情况下,尾随的零都不会影响使用这些值中的任何一个进行的计算,而呈现这些值的唯一方法是将结果转换为字符串并自己填充。要获得一些帮助,您可能希望看到


例如,我创建了一些特殊的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);
}

}

然后,对2个小数进行同样的处理。

关于decimal数据类型的w3c文档说
fractionDigits
指定小数分隔符后位数的上限。如果没有右边的零,那么读取数据对任何人都不重要。什么用例需要零填充?@Jim(遗留)应用程序解析我生成的XML文件需要零填充;-)您能像我的回答中那样使用
precisionDecimal
吗?根据我的回答,JAXB规范不包括将XML模式1.1转换为Java。XJC抛出以下异常
[ERROR]src resolve:无法将名称'xsd:precisionDecimal'解析为(n)'type definition'组件。
当我尝试时。实际上我现在正在这样做,但我正试图找到一个更干净的解决方案,因为这需要我为每个
totalDigits
-
fractionDigits
组合创建一个
printMethod
@XmlElement(name = "rate", required = true)
@XmlJavaTypeAdapter(BigDecimal8PlaceAdapter.class)
protected BigDecimal rate;