JAX-WS要求所有傳輸的類都有一個默認的構造函數(無參數構造函數)。我不明白這一要求,因爲客戶端基於WSDL創建了自己的類。 IMO此要求僅適用於那些用作Web服務的輸入參數的類。爲什麼JAX-WS導出的對象需要默認構造函數?
有誰知道如何繞過這個要求?
JAX-WS要求所有傳輸的類都有一個默認的構造函數(無參數構造函數)。我不明白這一要求,因爲客戶端基於WSDL創建了自己的類。 IMO此要求僅適用於那些用作Web服務的輸入參數的類。爲什麼JAX-WS導出的對象需要默認構造函數?
有誰知道如何繞過這個要求?
當您使用JAX-WS您使用的是JAXB實現序列化Java對象到XML 。
所以,'問題'是JAXB的工作原理。
要使用JAXB,你需要創建一個可以封送/取消封送一個的JAXBContext傳遞的所有類。創建上下文時,JAXB將檢查所有給定的類是否具有無參數構造函數。如果這些類中至少有一個沒有這種類型的構造函數,則不會創建該上下文。
爲什麼JAXB這樣做?僅當從XML轉換爲對象(解組)時,它才需要這個無參數構造函數,但問題在於當您創建上下文時,JAXB不知道您想要做什麼(編組或解組)。
結論: JAXB將只接受它可以編組和解組的類。更多信息here
瞭解了這一點,在JAX-WS中會發生什麼?
在聲明@WebMethod
的參數和返回值類將被添加到JAXB上下文。正因爲如此,所有與Web服務輸入和輸出相關的類都需要一個無參數構造函數。
結論:是JAXB故障;-)
但是,如果我需要使用不具有一個無參數的構造函數的類是什麼?
您可以使用XMLAdapter!有關更多信息,請檢查this post ...
有誰知道如何繞過這個要求?
是 - 重寫JAX-WS。
它可能使用默認ctor和反射來填充對象,因爲它不會輕易知道像您這樣的人可能會寫的每個可能的ctor。
這是使用別人的框架的缺點:你必須按照他們的規則玩。
客戶基於WSDL
我以爲這就是圖書館幫助客戶做創建自己的類。您沒有編寫代碼來解析和解釋WSDL,是嗎?
對象不得由服務器端的JAX-WS填充。 JAX-WS只傳輸它們。 – Stefan 2012-07-11 10:00:19
所以這個問題似乎是JAXB沒有區分它需要編組或解組的類。如果支持此功能,則JAX-WS可以構建相應的JAXBContext。我認爲這會爲即將到來的JAXB規範提出一個很好的功能要求。 – Stefan 2012-07-13 06:27:06
我非常同意你的看法。實際上,來自MOXy的人(由EclipseLink實現的JAXB)有一個公開票證來添加多參數構造器支持: https://bugs.eclipse.org/bugs/show_bug.cgi?id=328951 – ggarciao 2012-07-13 07:59:12