2012-06-22 89 views
2

我正在生成基於webservice的jaxws客戶端。 Jaxb將使用java.lang.Boolean而不是原始類型生成布爾值。除此之外,它將生成bean的is()命名約定。JSF 2複選框和布爾型獲取者

但是,如果我嘗試布爾(如isOptional())鏈接到一個複選框,它會拋出以下異常:

value="#{property.optional}": Property 'optional' not readable on type java.lang.Boolean 

我的谷歌技術已經通知我說,JSF工作正常:

boolean isOptional() 
boolean getOptional() 
Boolean getOptional() 

但不能與

Boolean isOptional() 

但是它不是手動更新豆可行由於webservices的大小和數量,有沒有什麼辦法可以讓jsf正確地使用java.lang.Boolean isOptional()?或者我可以以某種方式在發生時在jaxb綁定文件中定義一個屬性,它會奇蹟般地生成「getOptional()」?

在一個旁註,下面做工作:

<h:selectBooleanCheckbox value="#{property.isOptional()}"/> 

但是我不能真正推測更新的價值,因爲它無法找到的制定者。

編輯:我運行最新的JDK 7, 「Java的版本」 的輸出:

java version "1.7.0_05" 
Java(TM) SE Runtime Environment (build 1.7.0_05-b05) 
Java HotSpot(TM) Client VM (build 23.1-b03, mixed mode, sharing) 

「的wsimport -version」 的輸出:

JAX-WS RI 2.2.4-b01 

生成代碼:

​​

回答

4

Jaxb將使用java.lang.Boolean而不是原始類型生成布爾值。除此之外,它將生成bean的is()命名約定。

使用is吸氣前綴java.lang.Boolean是JAXB的一個已知的重大失誤。已於2010年4月發佈的It has been fixed in version 2.1.13。保持你的圖書館是最新的。

另請參見this blog article的一些背景。

大JAXB API大錯

2006年9月15日

你得把它交給孫擰這一個。當文檔和教科書一樣厚時,編寫不符合規範的軟件是一回事。例如,以W3C創建的任何內容爲例。然而,當你自己的規格說明你無法遵循時,尤其是當它是最知名的部分時,這真的很糟糕。沒錯,Sun在創建JAXB 2.0 API時錯過了他們自己規範的一英里。生成java.lang.Boolean屬性的getter方法時,JAXB 2.0編譯器(XJC)錯誤地使用前綴「is」而不是「get」。雖然JavaBean規範指出原始布爾值的讀取方法可以使用替代的「is」前綴,但這種靈活性不會擴展到它的布爾包裝對應物。

8.3.2布爾屬性

另外,布爾屬性,我們允許的吸氣劑的方法相匹配的圖案:

public boolean is(); 

這 「是」 方法可以是提供而不是「get」方法,或者可以提供除「get」方法外的其他方法。無論哪種情況,如果「is」方法存在於布爾屬性中,那麼我們將使用「is」方法來讀取屬性值。

一個例子布爾屬性可能是:

public boolean isMarsupial(); 
public void setMarsupial(boolean m); 

鑑於JAXB是一個代碼生成框架,後面的代碼生成框架的想法是,該代碼是用來「爲是「,之後沒有修改,這是一個相當大的」哎呀「。雖然這個問題已經被報道,但是Sun的迴應是「抱歉,太遲了」。

此行爲受規範支配,不幸的是,現在規範改變太晚了。

就用戶體驗而言,感謝自動裝箱,我認爲這不會成爲真正的問題。您正在使用Introspector並且缺少該屬性的問題是? 太晚了?不是一個真正的問題?這是破產。修理它!我也不喜歡這種天真的說法,它可能不會影響框架。嗯,是的,它會,考慮到其他項目確實發生了堅持規範(冬眠,春天,myfaces等)

更新:Stevo斯拉夫告訴我,這已被固定在JAXB 2.1.13。詳情請參閱JAXB-131。是啊!

JSF/EL在這裏沒有錯。它的工作正確符合JavaBeans spec

+1

我運行在JDK 7的wsimport應該有適當的JAXB庫吧?查看原始問題以獲取更多信息。 – nablex

3

我不確定爲什麼最新最好的JAXB版本仍然會產生錯誤的方法,但我最終通過在wsimport調用中添加了「-B-enableIntrospection」(根據http://jaxb.java.net/2.2.4/docs/xjc.html)來修復它。這導致:

public Boolean getOptional() { 
    return optional; 
} 
+0

謝謝。這工作像一個魅力。 – Senstive