gpt4 book ai didi

jsf-2 - 如何将 List 值绑定(bind)到 JSF 中的 selectManyListbox

转载 作者:行者123 更新时间:2023-12-01 04:56:49 25 4
gpt4 key购买 nike

情况:我有一个 JavaServer Faces 页面和一个 session 范围的托管 bean,它有两个 ArrayList<Integer>属性:一个用于保存可能值的列表,另一个用于保存选定值的列表。在 JSF 页面上有一个 <h:selectManyListBox>绑定(bind)了这两个属性的组件。

问题:提交表单后,选定的值将被转换为字符串(ArrayList 类型的属性实际上包含几个字符串!);但是,当我使用转换器时,会收到如下错误消息:

Validation Error: Value is not valid

问题:如何绑定(bind) ArrayList<Integer>属性(property)给<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>

和托管 bean:

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;
}
}

最佳答案

List<Integer>的泛型类型信息在运行时丢失,因此只看到 List 的 JSF/EL无法识别通用类型是 Integer并假定它是默认的 String (因为这是应用请求值阶段底层 HttpServletRequest#getParameter() 调用的默认类型)。

您需要其中之一来显式指定 Converter ,您可以使用 JSF 内置 IntegerConverter :

<h:selectManyListbox ... converter="javax.faces.Integer">

只是为了使用Integer[]相反,其类型信息在运行时是清楚的:

private Integer[] selection;

关于jsf-2 - 如何将 List<Integer> 值绑定(bind)到 JSF 中的 selectManyListbox,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/13865804/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com