Эквивалентный Spring собственный редактор свойств Collection при использовании JSF - PullRequest
0 голосов
/ 18 декабря 2009

Я хотел бы знать, как использовать конвертеры в Java Server Faces, аналогичные редактору свойств коллекции Spring

Предположим, следующая модель

public class Group {

    private String name;

    List<User> users = new ArrayList<User>();

    // getter's and setter's
}

И эквивалентная форма

<form ...>
    <h1>Group form</h1>
    <label for="name">Enter name</label>
    <input type="text" name="name"/>

    <label for="users">Select users</label>
    <!--value attribute stores userId-->
    <input type="checkbox" value="1" name="users"/> User 1
    <input type="checkbox" value="2" name="users"/> User 2
    <input type="checkbox" value="3" name="users"/> User 3
</form>

Если я использую Spring для привязки свойства пользователя в классе группы, я звоню

binder.registerCustomEditor(List.class, new CustomCollectionEditor() {
    protected Object convertElement(Object userId)  {
        return new User((Integer) userId);
    }
});

Как получить такой же эффект при использовании Java Server Faces?

С уважением,

1 Ответ

1 голос
/ 18 декабря 2009

Для этого вы можете реализовать javax.faces.convert.Converter. Его API довольно понятен: напишите метод getAsString() соответственно, чтобы он возвращал String представление Object, которое может быть под каждым техническим идентификатором, таким как userId. Затем, чтобы JSF установил правильное значение Object на этапе применения параметров запроса, вам нужно реализовать getAsObject(), что он возвращает Object, связанный с данным значением String.

В основном:

public class UserConverter implements Converter {

    private UserDAO userDAO = SomeDAOManager.getUserDAO();

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

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return userDAO.find(Long.valueOf(value));
    }

}

Зарегистрируйте его в faces-config.xml следующим образом:

<converter>
    <converter-for-class>com.example.model.User</converter-for-class>
    <converter-class>com.example.converter.UserConverter</converter-class>
</converter>

Так и должно быть. Для получения более подробной информации вы можете эта или эта статья полезная.

...