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

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

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

这是一种可以做到的方法。

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上下文中注册。 这是完整示例的链接 。

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

  

这是我的格式化代码:

 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 { public BigDecimal unmarshal(String value) { return (sample.BigDecimalFormater.parseBigDecimal(value)); } public String marshal(BigDecimal value) { return (sample.BigDecimalFormater.printBigDecimal(value)); } } 

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