4
votes

Iam new to JSF technology, currently in our project we are using JSF 2.0 with spring and hibernate integration.I have one doubt regarding h:selectOneMenu and f:selectItems. From the Database i'm getting a list of UserBeans.I'm using like

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

Here user is of type UserBean and userList is the list of UserBeans. In the view page it is showing correctly but in the backing bean when i select one item and click on submit button, it showing the selected user as NULL.

My doubt is i can only pass List of SelectItem objects for the f:selectItems or any other beans list ..??

Is there any other way to populate the list of UserBeans otherthan SelectItem for selectItems.

Thank you All, Anil

1
only share a little code please.Kerem Baydoğan
edit your qestion dont post comments with code.Kerem Baydoğan

1 Answers

6
votes

You have set the user ID as value of the select items, but you seem to be trying to bind the value to a fullworthy User property in the bean. You need to bind it as an user ID.

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

If your sole intent is to be able to select and set User instead of only the ID, then you need a Converter to convert between User and String. That's because HTTP/HTML doesn't understand Java objects. It only understands strings. Here's a kickoff example:

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

with

@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());
    }

}

However, this is a pretty expensive job. I'd suggest to stick to passing ID around and obtain the real user in the bean's action method just once instead of letting the converter do it for every single item.