CXF客户端SOAP消息格式化

reg*_*lus 11 java soap wsdl web-services cxf

我用来创建CXF客户端的WSDL文件具有以下元素定义:

<xsd:element name="Rate"> 
  <xsd:simpleType>
    <xsd:restriction base="xsd:decimal">
      <xsd:totalDigits value="18" />
      <xsd:fractionDigits value="2" />
    </xsd:restriction>
  </xsd:simpleType>
</xsd:element>
Run Code Online (Sandbox Code Playgroud)

但是,当我尝试发送SOAP消息时,小数点后的位数超过最大值.例如,我得到2.48862,而期望2.48.为了解决这个问题,我计划实现一个XmlAdapter来编组值,但是我无法将WSDL中的元素映射到客户端,因为XmlAdapter的onyl类作为注释传递给字段decleration.

@XmlJavaTypeAdapter(CustomXmlAdapter.class)
Run Code Online (Sandbox Code Playgroud)

似乎没有办法通知XmlAdapter该字段必须在小数点后有2位数.

小数位数从元素到元素的变化.我也没有权限更改WSDL.

有没有办法在观察WSDL中指定的小数点数时格式化这些元素?

Rod*_*ati 1

我可能建议在 WSDL 引用的模式上使用 xQuery。模式的名称和位置是 WSDL 的一部分,也可以通过 XQuery 检索。

模式是格式良好的 XML,因此您只需确定正确的 XPath 选择器即可检索所需的值 - 在本例中,至少是这样的...

//xsd:element[@name == 'Rate']//xsd:fractionDigits/@value
Run Code Online (Sandbox Code Playgroud)

这应该产生值 2。

请记住,最新的 JDK 中内置了一个 XPath/XQuery 解释器。你只需要在上面放置某种前端,我相信它会很好地处理流。

执行上述操作将使您在处理给定元素时动态查询架构,例如,允许您在处理费率时获得正确的小数位数。