Как мне получить selectManyCheckBox, чтобы он возвращал что-то отличное от List <String>? - PullRequest
4 голосов
/ 03 сентября 2011

Это шаблон, который я бы использовал снова и снова, если бы заставил его работать.У меня есть имя перечисления Log.LogKey, которое я хочу, чтобы пользователь выбирал экземпляры.Таким образом, у лицевой стороны есть это:

             <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 () .Атрибут selectItems вызывает это правильно, потому что это строка, которая отображается для пользователя.И этот компонент имеет:

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.Ссылка на # {lk} в теге selectItems преобразует объект в строку.Каков был бы правильный способ сделать это?

1 Ответ

5 голосов
/ 03 сентября 2011

Вам необходимо указать конвертер. JSF EL не знает об общем типе List, потому что он потерян во время выполнения. Если вы не укажете явно конвертер, JSF не будет конвертировать отправленные значения String и заполнять их списком.

В вашем конкретном случае вы можете использовать встроенную JSF EnumConverter, вам просто нужно super() тип enum в конструкторе:

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>

Смотри также:

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