2012-02-18 65 views
0

我有一個selectOneMenu管理兩個對象A和B之間的關係。 其中A是固定的,B可通過菜單進行選擇。
表單提交B發送給bean進行進一步處理(創建和保存關係對象AToB)。jsf將selectOneMenu值作爲直接請求託管bean發送

不工作的情況!

<h:selectOneMenu value=#{b}> 
    <!-- b items from bean --> 
</h:selectOneMenu> 
<h:commandButton action="#{bean.addBToSelA(b)}"/> 

<managed-bean> 
    <description>B Entity Request Bean</description> 
    <managed-bean-name>b</managed-bean-name> 
    <managed-bean-class>B</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

工作情況!

但是,如果selectOneMenu值是不同的託管bean的嵌套屬性,它將起作用。 (例如AToB)

<h:selectOneMenu value=#{aToB.b}> 
    <!-- b items from bean --> 
</h:selectOneMenu> 
<h:commandButton action="#{bean.addBToSelA(aToB.b)}"/> 

<managed-bean> 
    <description>AToB Entity Request Bean</description> 
    <managed-bean-name>aToB</managed-bean-name> 
    <managed-bean-class>AToB</managed-bean-class> 
    <managed-bean-scope>request</managed-bean-scope> 
</managed-bean> 

注意:如果我的「b」只是一個不同的請求託管bean的屬性就足夠了。

有人可以如此善良,並解釋爲什麼?

回答

1

因爲JSF已經預先創建了bean實例。如果實例已存在於範圍中,它將不會被模型值覆蓋。從faces-config.xml刪除<managed-bean>,它會工作得很好。


無關的具體問題,你似乎已經使用JSF 2.x版本爲什麼要堅持使用舊的JSF 1.x風格faces-config.xml配置?只需使用@ManagedBean註釋(當然,僅在真正的支持bean類上)。

+0

感謝您的回答,稍後會進行測試。那些請求範圍的實體只是來自Hibernate的Pojo,根本沒有任何註解。它們從EAR中檢索並在客戶端共享(將來)。我的想法是,如果有必要,我可以通過這種方式爲每個客戶保持獨立性和不同性。如果註釋是應用程序/項目特定的,肯定不會重用,我不介意將它們插入到源代碼中。但仍然各有利弊。 – djmj 2012-02-18 04:07:45

+0

我無法刪除它,因爲我有另一個表單,可以在其中添加具有用戶輸入屬性的新B對象。所以我只需要重命名它。 – djmj 2012-02-18 04:37:00