Java 使用fractionDigits对BigDecimal进行JAXB编组
这就是我的问题。我得到了一个XSD,生成的XML文件应该符合这个XSD。使用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组合编写
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;