我需要解决这个业务需求,但我遇到了一些不必要的行为,我需要专家的协助。 我正在使用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;?
谢谢!
答案 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。