JSF 2.0带SelectItems的SelectOneMenu

JSF 2.0带SelectItems的SelectOneMenu,jsf,jsf-2,Jsf,Jsf 2,我是JSF技术的新手,目前在我们的项目中,我们正在使用JSF2.0与spring和hibernate集成。 从数据库中我得到了一个UserBeans列表。我使用 <h:selectOneMenu id="users" value="#{MyBean.user}"> <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userI

我是JSF技术的新手,目前在我们的项目中,我们正在使用JSF2.0与spring和hibernate集成。 从数据库中我得到了一个UserBeans列表。我使用

<h:selectOneMenu id="users" value="#{MyBean.user}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}"    itemValue="#{user.userId}" />
</h:selectOneMenu>

这里user是UserBean类型,userList是UserBean的列表。 在视图页面中,它显示正确,但在后台bean中,当我选择一个项目并单击submit按钮时,它将所选用户显示为NULL

我的疑问是我只能传递f:selectItems或任何其他Bean列表的SelectItem对象列表

除了selectItems的SelectItem之外,还有其他方法填充UserBean列表吗

谢谢大家,,
Anil

您已将用户ID设置为所选项目的值,但您似乎试图将
绑定到bean中的一个完整
用户
属性。您需要将其绑定为用户ID

<h:selectOneMenu id="users" value="#{MyBean.userId}">
   <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>


然而,这是一项相当昂贵的工作。我建议坚持在bean的action方法中只传递一次ID并获得真实用户,而不是让转换器为每个项目都这样做。

请只共享一点代码。编辑您的qestion,不要用代码发表评论。谢谢您,BalusC…我要做的是将完整的用户bean绑定为所选用户…使用
转换器
。我已经用一个例子更新了答案。非常感谢巴卢斯。。。但是我更新了我的代码,为我的SelectOne菜单放置了userId和一个onchange事件,就像这样onchange=“alert”('--'+'document.getElementById('users').value);它显示了所有对象的列表,以字符串值…然后您使用的是
itemValue=“#{user}“
不带转换器。这样表单就不会提交,我选择的值也不在那里,默认值——选择一个——就会显示出来
<h:selectOneMenu id="users" value="#{MyBean.user}">
   <f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user}" />
</h:selectOneMenu>
@FacesConverter(forClass=User.class)
public class UserConverter implements Converter {

    @Override
    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        try {
            return userService.findById(Long.valueOf(value));
        } catch (SomeException e) {
            throw new ConverterException(new FacesMessage(String.format("Cannot convert %s to User", value)), e);
        }
    }

    @Override
    public String getAsString(FacesContext context, UIComponent component, Object value) {
        return String.valueOf(((User) value).getId());
    }

}