我在requestScope中使用managedBean userHome ,其中实体'user'将继续存在。 用户具有以ManyToOne关系映射的leader列。我的代码看起来像这样
@ManagedBean
@RequestScoped
public class UserHome {
private User user = new User();
// Getters and Setters
private List<SelectItem> selectItems = new ArrayList<SelectItem>();
public UserHome() {
for(User user: availableLeaders) {
selectItems.add(new SelectItem(user.getName(), user));
}
}
public void persis();
}
User.java
public class User {
@Id
@Column
private Integer id;
@Column
privat String name;
@ManyToOne
private User leader;
}
我试图通过h:selectOneMenu
像这样
<h:selectOneMenu value="#{userHome.user.leader}" converter="userConverter">
<f:selectItems value="#{userHome.selectItems}"/>
</h:selectOneMenu>
我的转换器看起来像这样
@FacesConverter(forClass = User.class, value="userConverter")
public class UserConverter implements Converter {
private Map<String, User> userValues = new HashMap<String, User>();
public UserConverter() {
init();
}
@Override
public Object getAsObject(FacesContext context, UIComponent component,
String value) {
return userValues.get(value);
}
@Override
public String getAsString(FacesContext context, UIComponent component, Object value) {
System.out.println("RAJASEKARAN "+value);
return ((User)value).getName();
}
public void init() {
UserHome userHome = new UserHome();
for(User user:userHome.availableLeaders()) {
userValues.put(user.getName(), user);
}
}
}
尝试保存用户时我收到错误UserEdit:j_idt18:验证错误:值无效
答案 0 :(得分:14)
添加到BalusC的答案:在回发之后,您需要确保用户实例与用于呈现选择项的用户实例完全相同,或者您为User类实现了等号。
代码没有显示availableLeaders
的来源,但是如果这是从按需提取的数据库中提取的,那么转换器将不会转换为JSF通过列表中的完全相同的对象实例#{userHome.selectItems}
。
转换后,JSF将使用equals()
方法检查是否可以在该列表中找到转换后的实例。
答案 1 :(得分:8)
你以错误的方式构建了SelectItem
。根据{{3}},第一个参数应表示项目值(将被转换和提交),第二个参数应表示项目标签(将在列表中显示)。但是你反过来指定了它们。
相应修复:
selectItems.add(new SelectItem(user, user.getName()));
如果仍然无法解决问题,那么这意味着equals()
类的User
方法没有(正确)实现。转换后,JSF将使用它来验证列表中任何项目值的选定User
。
无关,知道JSF2中的<f:selectItems>
为您提供构建列表的可能性,而无需构建{{1}列表可能会有用。手动。这是一个完全相同的例子:
SelectItem
这允许你摆脱额外的<f:selectItems value="#{userHome.availableLeaders}" var="user"
itemValue="#{user}" itemLabel="#{user.name}" />
属性和bean构造函数中的循环。