2016-04-06 72 views
1

我需要解決這一業務需求,但我遇到了一些不需要的行爲,我需要專家的幫助。 我使用JSF 2.2.13,總理面臨5.3同一個豆的多個託管屬性,在同一類

我有這樣

@ManagedBean(name = "userBean") 
@RequestScoped 
public class UserBean implements Serializable { 
    private Long id; 
    private String firstName; 
    private String lastName; 
    @ManagedProperty(value = "#{countryBean}") 
    private CountryBean phoneCode1; 
    private String phoneNumber1; 
    @ManagedProperty(value = "#{countryBean}") 
    private CountryBean phoneCode2; 
    private String phoneNumber2; 
... 
...getter/setter 

一個的UserBean像這樣

@ManagedBean(name = "countryBean") 
@RequestScoped 
public class CountryBean implements Serializable{ 
    private Long id; 
    private String isoCode; 
    private String phoneCode; 
    ... 
    ...getter/setter 

的問題CountryBean(因爲你可能已經知道)是在UserBean內部,我們有超過1個字段(phoneCode1,phoneCode2)具有相同的託管屬性(countryBean)。

奇怪的行爲是在數據庫(MySQL)內部,我的應用程序爲所有這些字段(phoneCode1,phoneCode2)保存相同的值,即使在前端選擇了不同的值。

在前端我有這段代碼

<h:selectOneMenu value="#{userController.userBean.phoneCode1.id}" class="form-control"> 
    <f:selectItem itemLabel="#{msg['seleziona']}" itemValue="" noSelectionOption="true" /> 
    <f:selectItems value="#{applicationScopedBean.countries}" var="ac" itemValue="#{ac.id}" itemLabel="#{ac.phoneCode}"/> 
</h:selectOneMenu> 
<h:selectOneMenu value="#{userController.userBean.phoneCode2.id}" class="form-control"> 
    <f:selectItem itemLabel="#{msg['seleziona']}" itemValue="" noSelectionOption="true" /> 
    <f:selectItems value="#{applicationScopedBean.countries}" var="ac" itemValue="#{ac.id}" itemLabel="#{ac.phoneCode}"/> 
</h:selectOneMenu> 

因此,以何種方式,我們可以解決這個業務需求?

我看到過類似的問題,但我不明白我是不是很好地使用JSF,或者它是JSF的限制。 但從它類似於問「哪一種方法,我可以創建一個表名爲‘A’與一些FK鏈接表‘B’數據庫的點?

謝謝!

+1

爲什麼你的CountryBean是一個bean和一個託管屬性是否有特定的原因?我仍然在學習自己,但我認爲你不需要像字符串那樣對待他們。 – klog

+0

國家是一個數據庫查找表,我需要的ID和名稱 – Gavi

+0

我不理解爲什麼UserBean和CountryBean是JSF ManagedBean,..他們只是簡單的數據結構 –

回答

0

事實上的錯誤是,在這種情況下,沒有理由使用註釋@ManagedProperty。

當在同一範圍內有多個實例時,使用@ManagedProperty無用。

@ManagedProperty的用途是確定使用範圍中唯一可用的實例。

-1

代替的@RequestScoped使用@NoneScoped爲CountryBean。

None Scope

+1

請添加評論部分....你仍然不確定你的答案。 –

+0

我需要50點聲望才能發表評論。 – Ravi

+1

然後嘗試給出你確認100%的問題的答案 –

0

我的情況和你的情況非常相似,但有點複雜,因爲我在「Parent」bean中有相同bean的幾個託管屬性,而且在用作託管屬性的bean中也有其他託管屬性屬性給其他豆子。這是因爲所有這些「孩子」豆都與前端元素綁定在一起,並且需要可重用(基本上是用於向用戶詢問他家的地址,他的工作以及其他額外位置的3個下拉列表元素)。問題是,當用戶選擇一個位置的地址時,這些值會在其他3個位置重複。

所以我解決這個問題是要確定所有的「孩子」豆(可重複使用的)作爲@NoneScoped和「父」 bean作爲@ViewScoped

而這個完美工作,地址爲每個位置不再互相干擾。所有這些仍然在「父」bean中擁有相同bean的幾個託管屬性。

希望這適用於有類似問題的人。

相關問題