[英]JAXB marshalling for BigDecimal using fractionDigits
所以這是我的問題。 我給了一個我生成的XML文件應符合的XSD。 使用org.apache.cxf.cxf-xjc-plugin
maven插件和外部綁定文件生成源代碼。 但是當我在嘗試編組我的對象時,生成的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>
有沒有辦法以干凈的方式解決這個問題?
我不希望為每個totalDigits
, fractionDigits
組合編寫幾個適配器。 由於XSD可能會發生變化,因此我希望保持生成的源代碼不變。
您需要在此用例中使用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>
欲獲得更多信息
如果您可以更改XSD以使用此處記錄的precisionDecimal
類型,則可以將minScale
和maxScale
構面設置為相同的值。
我對通過保持尾隨零可能獲得的東西感到困惑。
如果尾隨零保持重要,則使用字符串值而不是數字,並使用屬性指定其寬度和小數。
在任何情況下,尾隨零都不會影響使用任何這些值的計算,並且您能夠呈現它們的唯一方法是將結果轉換為字符串並自行填充。 對於一些幫助,你可能想看到......
例如,我創建了一些特殊的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做同樣的事情。
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.