jax ws双tostring更改格式

时间:2017-08-25 06:07:47

标签: java web-services wsdl jax-ws number-formatting

我们从客户处获得WSDL。 (即,我们无法改变它们。)

其中一种类型的定义如下所示:

public void setBigdecimal(Double value) {
this.bigdecimal = value;
}

导致像

这样的事情
<rpcOp:value>
  <rpcOp:bigdecimal>10.0</rpcOp:bigdecimal> <!-- IN SPITE OF THE NAME, THIS IS A DOUBLE VALUE! -->
  <rpcOp:string>N</rpcOp:string>
</rpcOp:value>

现在,当我们在其中发送具有此类型的请求时,它将生成如下内容:

{{1}}

客户希望显示的内容没有十进制数字,即10等。

我怀疑当从Java对象生成请求xml时,JAX-WS框架只调用Double.toString(),这将不可避免地添加小数点和十进制数字。

有没有办法在不修改WSDL的情况下改变它?为这种类型或类似的东西注册一些自定义数字格式化程序?

谢谢!

1 个答案:

答案 0 :(得分:0)

与此同时,我找到了解决方案。它看起来像这样:(使用JAXB)

xjc-serializable.xml:

...
<jaxb:globalBindings>
<xjc:serializable />
<!-- ADDED THIS: -->
<xjc:javaType name="java.lang.Double" xmlType="xs:double"
adapter="util.MyDoubleAdapter" />
</jaxb:globalBindings>
...

然后是java类:

public class MyDoubleAdapter extends XmlAdapter<String, Double> {

@Override
public String marshal(Double doubleValue) throws Exception {
    if (doubleValue == null) {
    return null;
    }
    String string = doubleValue.toString();
    if (string.endsWith(".0")) {
    string = string.replaceAll("\\.0", "");
    }
    return string;
}

public Double unmarshal(String stringValue) throws Exception {
    if (stringValue == null) {
    return null;
    }
    return Double.valueOf(stringValue);
}

}

然后你去。