BigDecimal在肥皂信息中有科学记数法

Pio*_*ski 6 java xsd soap web-services

我的网络服务有一个奇怪的问题.我有对象OrderPosition有一个价格(xsd:decimal,fractionDigits = 9).Apache CXF为我生成代理类,这个字段是BigDecimal.当我想发送大于10000000.00000的值时,soap消息中的这个字段有科学记数法(例如1.1423E + 7).

如何强制该值未以科学记数法发送.

San*_*osh 4

这是实现此目的的一种方法。

BigDecimal有一个构造函数,它将输入数字作为字符串。.toString()使用此方法时,会在调用其方法时保留输入格式。例如

BigDecimal bd = new BigDecimal("10000000.00000");
System.out.println(bd);
Run Code Online (Sandbox Code Playgroud)

将打印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;
        }
    }
}
Run Code Online (Sandbox Code Playgroud)

这需要在 Jaxb 上下文中注册。这是带有完整示例的链接