【问题标题】:Equivalent Spring custom Collection property editor when using JSF使用 JSF 时等效的 Spring 自定义 Collection 属性编辑器
【发布时间】:2009-12-17 22:06:55
【问题描述】:

我想知道如何在 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 在 Group 类中绑定 users 属性,我会调用

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

使用 Java Server Faces 时如何获得相同的效果?

问候,

【问题讨论】:

    标签: java spring jsf binding collections


    【解决方案1】:

    为此,您可以实现javax.faces.convert.Converter。它的 API 非常不言自明:相应地编写getAsString() 方法,它返回ObjectString 表示,它可以在每个技术ID 下,例如userId。然后,要让 JSF 在应用请求参数阶段设置正确的Object,您需要实现getAsObject(),它返回与给定String 值关联的Object

    基本上:

    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>
    

    应该是这样的。如需更多见解,您可以thisthis 有用的文章。

    【讨论】:

    • 谢谢你,BalusC (+1)。但它会自动映射到用户属性吗?
    • 您无需担心。转换是完全透明的。只需在 faces-config.xml 中定义一次就可以了。
    • BalusC,我想这个转换器是“全局的”。但是我应该怎么做才能设置一个“本地”转换器?
    • 是的,它将转换 JSF 在呈现响应期间遇到的每个 #{user}(用于显示)或应用请求值(以设置为 bean 属性)。如果要单独使用它,请使用&lt;converter-id&gt; 而不是&lt;converter-for-class&gt;,并在JSF 组件的converterId 属性中指定相同的&lt;converter-id&gt; 值。但是,我质疑仅以纯文本形式显示 #{user} 的价值(这将只是 String.valueOf(user))。全局声明更简单、更简洁。
    • 取决于用例。你说的是哪种继承?模型或转换器的超类/子类?如果是第一个,转换器将只覆盖子类。如果是第二个,我不认为有任何问题。顺便说一句,PhaseListener 仅在您确实想挂接到任何阶段时才有价值,而事实似乎并非如此。
    猜你喜欢
    • 2014-10-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多