我的网络服务有一个奇怪的问题。 我有对象OrderPosition有一个价格(xsd:decimal,fractionDigits = 9)。 Apache CXF为我生成代理类,这个字段是BigDecimal。当我想发送大于10000000.00000的值时,肥皂信息中的这个字段有科学记数法(例如1.1423E + 7)。
如何强制执行该值尚未以科学记数法发送。
答案 0 :(得分:3)
这是一种可以做到的方法。
BigDecimal
有一个构造函数,它将输入数字作为字符串。这在使用时,在调用其.toString()
方法时保留输入格式。例如
BigDecimal bd = new BigDecimal("10000000.00000"); System.out.println(bd);
将打印10000000.00000
。
可以在 Jaxb XmlAdapters
中使用此功能。 Jaxb XmlAdapters提供了一种方便的方法来控制/自定义编组/解组过程。 BigDecimmal
的典型适配器如下所示。
public class BigDecimalXmlAdapter extends XmlAdapter{
@Override
public String marshal(BigDecimal bigDecimal) throws Exception {
if (bigDecimal != null){
return bigDecimal.toString();
}
else {
return null;
}
}
@Override
public BigDecimal unmarshal(String s) throws Exception {
try {
return new BigDecimal(s);
} catch (NumberFormatException e) {
return null;
}
}
}
这需要在Jaxb上下文中注册。 Here is the link完整示例。
答案 1 :(得分:0)
<jaxb:javaType name="java.math.BigDecimal" xmlType="xs:decimal"
parseMethod="sample.BigDecimalFormater.parseBigDecimal"
printMethod="sample.BigDecimalFormater.printBigDecimal" />
这是我的格式化代码:
public class BigDecimalFormater {
public static String printBigDecimal(BigDecimal value) {
value.setScale(5);
return value.toPlainString();
}
public static BigDecimal parseBigDecimal(String value) {
return new BigDecimal(value);
}
}
然后这个插件为我生成适配器
public class Adapter1 extends XmlAdapter<String, BigDecimal> {
public BigDecimal unmarshal(String value) {
return (sample.BigDecimalFormater.parseBigDecimal(value));
}
public String marshal(BigDecimal value) {
return (sample.BigDecimalFormater.printBigDecimal(value));
}
}
在生成的类中,BigDecimal字段有注释@XmlJavaTypeAdapter(Adapter1 .class),它解决了问题。