如何让selectManyCheckBox返回List <string>以外的其他内容?</string>

时间:2011-09-03 16:18:23

标签: jsf-2

这是一种模式,如果我让它工作,我会一遍又一遍地使用它。我有一个枚举名称Log.LogKey,我希望用户选择实例。所以facelet有这个:

             <h:form id="testForm" >

                <h:selectManyCheckbox value="#{test.selectedKeys}" >
                    <f:selectItems value="#{test.allKeys}"
                                   var="lk"
                                   itemLabel="#{lk.display}"
                                   itemValue="#{lk}" />
                </h:selectManyCheckbox>

                <h:commandButton value="Do It" action="#{test.doNothng}" />

            </h:form>

枚举有一个名为 getDisplay()的getter。 selectItems 属性正确调用,因为这是呈现给用户的字符串。支持bean有这个:

public class Test implements Serializable {

private List<Log.LogKey> selectedKeys = null;

public List<Log.LogKey> getAllKeys() {
    return Arrays.asList(Log.LogKey.values());
}

public List<Log.LogKey> getSelectedKeys() { return selectedKeys; }

public void setSelectedKeys(List selected) {
    System.out.println("getSelecgedKeus() got " + selected.size());
    int i = 0;
    for (Object obj : selected) {
        System.out.println(i++ + " is " + obj.getClass() + ":" + obj);
    }
}

public String doNothng() { return null; }

}

因此,在表单提交中,数组 setSelectedKeys(selected)将使用字符串列表调用,而不是使用Log.LogKey列表调用。 selectItems 标记中对#{lk} 的引用是将对象转换为字符串。什么是正确的方法呢?

1 个答案:

答案 0 :(得分:5)

您需要指定转换器。 JSF EL不了解泛型List类型,因为它在运行时丢失了。如果您没有明确指定转换器,JSF将不会转换提交的String值,并使用它们填充列表。

在您的特定情况下,您可以使用JSF内置EnumConverter,您只需super()构造函数中的枚举类型:

package com.example;

import javax.faces.convert.EnumConverter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value="logKeyConverter")
public class LogKeyConverter extends EnumConverter {

    public LogKeyConverter() {
        super(Log.LogKey.class);
    }

}

要使用它,只需按如下方式声明:

<h:selectManyCheckbox value="#{test.selectedKeys}" converter="logKeyConverter">
    ...
</h:selectManyCheckbox>

另见: