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

时间:2013-11-21 08:09:02

标签: java web-services soap xsd

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

如何强制执行该值尚未以科学记数法发送。

2 个答案:

答案 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)

@Santosh谢谢! XMLAdapter就是我所需要的。 此外,正如我在我的问题中所说,我使用Apache CXF生成客户端类。在这种问题中,我不得不将以下代码添加到bindings.xjb(在maven中用于cxf-codegen-plugin的绑定文件)。

<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),它解决了问题。