同一类中同一 Bean 的多个托管属性



我需要解决此业务需求,但我遇到了一些不需要的行为,我需要专家的帮助。我正在使用 JSF 2.2.13,Prime Faces 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

还有这样的乡村豆

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

问题(您可能已经知道(是,在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"?

谢谢!

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

所以我对这个问题的解决方案是将所有"子"豆(可重用的(设置为@NoneScoped,将"父"豆设置为@ViewScoped

这非常有效,每个位置的地址不再相互干扰。所有这些在"父"bean中仍然具有同一bean的多个托管属性。

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

代替

@RequestScoped使用CountryBean的@NoneScoped

无范围

事实上,错误在于在这种情况下没有理由使用注释@ManagedProperty。

当同一作用域中有多个实例时,使用该@ManagedProperty是没有用的。

@ManagedProperty的目的是标识所用作用域中唯一的可用实例。

最新更新