2013-12-20 76 views
11

我用來創建CXF客戶端的WSDL文件有此元素的定義:CXF客戶端SOAP消息格式化

<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> 

然而,當我嘗試發送SOAP消息,中位數在後小數點超過最大值。例如,當期望2.48時,我得到2.48862。爲了解決這個問題,我計劃實現一個XmlAdapter來編組值,但是我無法將WSDL中的元素映射到客戶端,因爲XmlAdapter的onyl類是作爲註釋傳遞給字段刪除的。

@XmlJavaTypeAdapter(CustomXmlAdapter.class) 

似乎沒有辦法通知XmlAdapter該字段在小數點後必須有2位數字。

小數位數的數量因元素而異。我也沒有訪問權限來更改WSDL。

有沒有辦法在觀察WSDL中指定的小數點的同時格式化這些元素?

+2

你已經看過[這個SO帖子](http://stackoverflow.com/questions/14848776/jaxb-marshalling-for-bigdecimal-using-fractiondigits)?它似乎解決了一個類似的問題。 –

+0

是的,我已經看到它,然後我已經發布。它要求我爲每個不同數量的分數創建一個不同的類。 – regulus

+0

什麼對你最好,取決於你的特定用例。您是否正在處理使用不同貨幣的交易金額可能需要不同精度的多幣種金融軟件?那麼你可能想要尋找一個比這更靈活的框架。另一方面,如果每個實體/財產都有自己的固定精度,那麼您應該理所當然地認爲您可能不得不爲每個實體/財產實施單獨的類別。究竟有多少種精度?如果你擔心代碼重複,那麼希望繼承類可以有所幫助。 –

回答

1

我可能會建議在WSDL引用的模式上使用xQuery。模式的名稱和位置是WSDL的一部分,也可以通過XQuery檢索。

模式是格式良好的XML,所以你只需要確定正確的XPath選擇,以檢索所需的值 - 在這種情況下,這將是至少像...

//xsd:element[@name == 'Rate']//xsd:fractionDigits/@value 

這應該產生值2.

請記住,最新的JDK中內置了XPath/XQuery解釋器。你只需要在其上放置某種前端,我相信它能很好地處理流。

通過執行上述操作,您可以在處理給定元素時動態查詢模式,從而允許您在處理速率時獲得正確的小數位數。