gpt4 book ai didi

jsf - 两个不同的 SelectItem 返回单个选定值

转载 作者:行者123 更新时间:2023-12-01 13:54:41 24 4
gpt4 key购买 nike

我有一个乡村类(class):

public class Country{
private Long id;
private String name;
}

以及具有两个 Country 字段的 person 类
public class Person{
private Country nationality;
private Country nationality2;
}

现在在 JSF 中我使用 <f:selectItems>返回国家列表以选择国籍如下:
<h:form id="form1">
<h:selectOneMenu value="#{mybean.person.nationality.id}">
<f:selectItems value="#{mybean.countryList}" var="var" itemValue="#{var.id}"/>
</h:selectOneMenu>

<h:selectOneMenu value="#{mybean.person.nationality2.id}">
<f:selectItems value="#{mybean.countryList}" var="var" itemValue="#{var.id}"/>
</h:selectOneMenu>
<p:commandButton actionListener="#{mybean.save}" update="sometable @form"/>
</h:form>

现在奇怪的问题是,当我提交表单时,分配给第二个字段 (nationality2) 的值会同时分配给 nationality 和 nationality2,而不管为第一个字段选择了什么。例如,如果 selected value for nationality is 1selected value for nationality2 is 2 , 当我提交表单时 both fields have the value 2 .为什么会出现这种情况?

PS:JSF 实现是 Mojarra 2.1.3

最佳答案

您的具体问题是因为您正在设置相同的副本 Country引用作为选定值,然后仅操作 id属性(property)。在一个引用中所做的所有更改也会反射(reflect)在所有其他引用中。

例如。

Country country = new Country();
person.setNationality1(country);
person.setNationality2(country);
country.setId(1); // Gets reflected in both nationalities!

你最好设置整个 Country实体作为值而不是操作其属性。创建一个 ConverterCountry 之间转换和 id :
@FacesConverter(forClass=Country.class)
public class CountryConverter implements Converter {

@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
return (value instanceof Country) ? ((Country) value).getId() : null;
}

@Override
public Object getAsObject(FacesContext context, UIComponent component, String value) {
if (value == null || value.isEmpty()) {
return null;
}

if (!value.matches("\\d+")) {
throw new ConverterException(new FacesMessage("Invalid country ID: " + value));
}

Long countryId = Long.valueOf(value);
MyBean myBean = context.getApplication().evaluateExpressionGet(context, "#{myBean}", MyBean.class);

for (Country country : myBean.getCountries()) {
if (countryId.equals(country.getId())) {
return country;
}
}

throw new ConverterException(new FacesMessage("Unknown country ID: " + value));
}

}

并按如下方式使用它:
<h:selectOneMenu value="#{mybean.person.nationality1}">
<f:selectItems value="#{mybean.countries}" var="country" itemValue="#{country}" itemLabel="#{country.name}" />
</h:selectOneMenu>
<h:selectOneMenu value="#{mybean.person.nationality2}">
<f:selectItems value="#{mybean.countries}" var="country" itemValue="#{country}" itemLabel="#{country.name}" />
</h:selectOneMenu>

关于jsf - 两个不同的 SelectItem 返回单个选定值,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/14952103/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com