Вы установили идентификатор пользователя в качестве значения для выбранных элементов, но, похоже, вы пытаетесь привязать value
к полноценному свойству User
в компоненте. Вам необходимо привязать его как идентификатор пользователя.
<h:selectOneMenu id="users" value="#{MyBean.userId}">
<f:selectItems value="#{MyBean.userList}" var="user" itemLabel="#{user.userName}" itemValue="#{user.userId}" />
</h:selectOneMenu>
Если ваше единственное намерение состоит в том, чтобы иметь возможность выбирать и устанавливать User
вместо только идентификатора, то вам необходимо Converter
для преобразования между User
и String
. Это потому, что HTTP / HTML не понимает объекты Java. Он понимает только строки. Вот начальный пример:
<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());
}
}
Однако это довольно дорогая работа. Я бы посоветовал придерживаться передачи идентификатора и получить реального пользователя в методе действия bean-компонента только один раз вместо того, чтобы позволить конвертеру делать это для каждого отдельного элемента.