Java BigDecimal在soap消息中具有科学符号

Java BigDecimal在soap消息中具有科学符号,java,web-services,soap,xsd,Java,Web Services,Soap,Xsd,我对我们的网络服务有奇怪的问题。 我有一个对象OrderPosition,它有一个价格(xsd:decimal,fractionDigits=9)。ApacheCXF为我生成代理类,这个字段是BigDecimal。当我想发送大于10000000.00000的值时,soap消息中的这个字段有科学的符号(例如1.1423E+7) 我如何才能强制执行该值未以科学记数法发送。这里有一种方法可以做到这一点 BigDecimal有一个构造函数,它将输入的数字作为字符串。使用时,当调用其.toString()

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


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

这里有一种方法可以做到这一点

BigDecimal
有一个构造函数,它将输入的数字作为字符串。使用时,当调用其
.toString()
方法时,将保留输入格式。e、 g

将打印
10000000.00000

这可以在Jaxb XmlAdapters中使用。Jaxb XmlAdapters提供了一种方便的方法来控制/定制编组/解编组过程。
bigdecymal
的典型适配器如下所示

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上下文中注册。有完整的例子

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


这是我的格式化程序代码:

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));
    }
}
公共类适配器1扩展了XmlAdapter{
公共BigDecimal解组(字符串值){
返回(sample.bigdecimalformatter.parseBigDecimal(value));
}
公共字符串封送处理(BigDecimal值){
返回(sample.bigdecimalformatter.printBigDecimal(value));
}
}

在生成的类中,BigDecimal字段有注释@XmlJavaTypeAdapter(Adapter1.class),它解决了问题。

您使用的是什么绑定(例如jaxb等)?我使用jaxb进行xml绑定。并且该字段有注释:@xmlement(name=“NetPrice”,required=true)受保护的BigDecimal NetPrice;看,也许你使用的是旧版本。
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));
    }
}