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),它解决了问题。
- 在javascript中使用RSA加密一个小字符串,然后在服务器上的java中解密
- 类型不匹配错误:Cannont无法从ArrayList 转换为List
- 如果没有明确关闭,ResultSet会泄漏吗?
- Java OOD和代码重复
- S3 Java客户端因“Content-Length delimited message body的过早结束”或“java.net.SocketException Socket closed”而失败了很多
- 是否可以再调试GWT?
- 如何使用BigDecimal会影响应用程序性能?
- Java是否允许您在Mac OS X上使用本机UI小部件?
- 是否有任何库将SQL查询表示为Java代码中的对象?