Jsf 2 如何让selectManyCheckBox返回列表以外的内容<;字符串>;?

Jsf 2 如何让selectManyCheckBox返回列表以外的内容<;字符串>;?,jsf-2,Jsf 2,这是一个模式,我会反复使用,如果我得到它的工作。我有一个枚举名Log.LogKey,我想让用户选择它的实例。因此,facelet具有以下特点: <h:form id="testForm" > <h:selectManyCheckbox value="#{test.selectedKeys}" > <f:selectItems value="#{test.allKeys

这是一个模式,我会反复使用,如果我得到它的工作。我有一个枚举名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>
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; }

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

             <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>
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; }
公共类测试实现可序列化{
私有列表selectedKeys=null;
公共列表getAllKeys(){
返回Arrays.asList(Log.LogKey.values());
}
公用列表getSelectedKeys(){返回selectedKeys;}
public void setSelectedKeys(选择列表){
System.out.println(“getSelecgedKeus()got”+selected.size());
int i=0;
用于(对象对象对象:选定){
System.out.println(i++“是”+obj.getClass()+”:“+obj);
}
}
公共字符串doNothng(){return null;}
}


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

您需要指定一个转换器。JSF EL不知道泛型
列表
类型,因为它在运行时丢失。当您没有明确指定转换器时,JSF将不会转换提交的
字符串
值并用它们简单地填充列表

在您的特定情况下,您可以使用JSF内置,只需
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);
    }

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


...
另见:

我不知道我怎么会错过其他的帖子。再次感谢,不客气。可能您省略了“enum”作为搜索关键字;)