JSF 2.0 selctOneMenu с SelectItems - PullRequest
       0

JSF 2.0 selctOneMenu с SelectItems

4 голосов
/ 26 мая 2011

Я новичок в технологии JSF, в настоящее время в нашем проекте мы используем JSF 2.0 с пружинной и гибернационной интеграцией. У меня есть одно сомнение в отношении h: selectOneMenu и f: selectItems.Из базы данных я получаю список UserBeans. Я использую как

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

Здесь пользователь имеет тип UserBean, а userList - это список UserBeans.На странице просмотра он отображается правильно, но в компоненте поддержки, когда я выбираю один элемент и нажимаю кнопку отправки, он показывает выбранного пользователя как NULL.

Я сомневаюсь, что я могу только передать список объектов SelectItem для f: selectItems или любого другого списка bean-компонентов. ??

Есть ли другой способ заполнить список UserBeans кроме SelectItemдля избранных элементов.

Спасибо всем, Анил

1 Ответ

6 голосов
/ 26 мая 2011

Вы установили идентификатор пользователя в качестве значения для выбранных элементов, но, похоже, вы пытаетесь привязать 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-компонента только один раз вместо того, чтобы позволить конвертеру делать это для каждого отдельного элемента.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...