同一个bean的多个托管属性,在同一个类

时间:2016-04-06 22:27:30

标签: jsf jsf-2 primefaces

我需要解决这个业务需求,但我遇到了一些不必要的行为,我需要专家的协助。 我正在使用JSF 2.2.13,Prime Faces 5.3

我有像这样的UserBean

@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

和像这样的CountryBean

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

问题(您可能已经知道)是在UserBean中我们有多个相同托管属性(countryBean)的字段(phoneCode1,phoneCode2)。

奇怪的是,在数据库(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限制。 从数据库的角度来看,它与ask&#34;类似,我可以通过哪种方式创建一个名为&#34; A&#34;将一些FK链接到表格&#34; B&#34;?

谢谢!

3 个答案:

答案 0 :(得分:0)

实际上错误是在那种情况下没有理由使用注释@ManagedProperty。

如果同一范围内有多个实例,则无法使用@ManagedProperty。

@ManagedProperty的目的是识别使用范围中唯一一个可用实例。

答案 1 :(得分:0)

我的情况与你的情况非常相似,但有点复杂,因为我在“父”bean中使用同一个bean的几个托管属性,并且在用作托管属性的bean中是父bean我还有其他托管属性到其他豆类。这是因为所有这些“子”bean都绑定到前端元素并且需要可重用(基本上是一个3下拉列表元素,用于询问用户他的房子的地址,他的工作和其他额外的位置)。问题是,当用户选择某个位置的地址时,值会在其他3个位置重复。

所以我解决这个问题的方法是将所有“子”bean(可重用的)设置为@NoneScoped,将“父”bean设置为@ViewScoped

这完美无缺,每个位置的地址不再相互干扰。所有这一切仍然在“父”bean中具有相同bean的几个托管属性。

希望这适用于有类似问题的人。

答案 2 :(得分:-1)

代替@RequestScoped使用@NoneScoped进行CountryBean。

None Scope