Как связать значения List<Integer> с selectManyListbox в JSF
Ситуация: у меня есть страница JavaServer Faces и управляемый bean-объект сессионной области, который имеет два ArrayList<Integer>
Свойства: один для хранения списка возможных значений, а другой для хранения списка выбранных значений. На странице JSF есть <h:selectManyListBox>
Компонент с этими двумя свойствами связаны.
Проблема: после отправки формы выбранные значения будут преобразованы в строку (свойство типа ArrayList на самом деле содержит пару строк!); однако, когда я использую конвертер, я получаю сообщение об ошибке, подобное этому:
Ошибка проверки: значение недействительно
Вопрос: как я могу связать ArrayList<Integer>
собственность на <h:selectManyListBox>
компонент правильно?
Спасибо за вашу помощь мне.
Конкретные коды
Страница JSF:
<?xml version='1.0' encoding='UTF-8' ?>
<!DOCTYPE html PUBLIC "-//W3C//DTD XHTML 1.0 Transitional//EN" "http://www.w3.org/TR/xhtml1/DTD/xhtml1-transitional.dtd">
<html xmlns="http://www.w3.org/1999/xhtml"
xmlns:ui="http://java.sun.com/jsf/facelets"
xmlns:h="http://java.sun.com/jsf/html"
xmlns:f="http://java.sun.com/jsf/core">
<h:body>
<h:form>
<h:selectManyListbox value="#{testBean.selection}">
<f:selectItems value="#{testBean.list}"></f:selectItems>
</h:selectManyListbox>
<h:commandButton action="#{testBean.go}" value="go" />
<ui:repeat value="#{testBean.selection}" var="i">
#{i}: #{i.getClass()}
</ui:repeat>
</h:form>
</h:body>
</html>
И управляемый боб:
import java.io.Serializable;
import java.util.ArrayList;
@javax.faces.bean.ManagedBean
@javax.enterprise.context.SessionScoped
public class TestBean implements Serializable
{
private ArrayList<Integer> selection;
private ArrayList<Integer> list;
public ArrayList<Integer> getList()
{
if(list == null || list.isEmpty())
{
list = new ArrayList<Integer>();
list.add(1);
list.add(2);
list.add(3);
}
return list;
}
public void setList(ArrayList<Integer> list)
{
this.list = list;
}
public ArrayList<Integer> getSelection()
{
return selection;
}
public void setSelection(ArrayList<Integer> selection)
{
this.selection = selection;
}
public String go()
{
// This throws an exception: java.lang.ClassCastException: java.lang.String cannot be cast to java.lang.Integer
/*for (Integer i : selection)
{
System.out.println(i);
}*/
return null;
}
}
1 ответ
Общая информация о типе List<Integer>
теряется во время выполнения и, следовательно, JSF/EL, который видит только List
не может определить, что общий тип Integer
и предполагает, что это по умолчанию String
(так как это тип по умолчанию базового HttpServletRequest#getParameter()
вызов на этапе применения значений запроса).
Вам нужно либо явно указать Converter
, вы можете использовать встроенную JSF IntegerConverter
:
<h:selectManyListbox ... converter="javax.faces.Integer">
или просто использовать Integer[]
вместо этого, чья информация о типе четко известна во время выполнения:
private Integer[] selection;