ClassCastException:设置布尔数组值jsf时的uirepeat索引

时间:2018-03-01 10:15:04

标签: arrays jsf boolean classcastexception uirepeat

数组大小取决于runtinme上的学生大小。我能够基于数组boolean在JSF中的selectBooleanCheckbox上有效地显示布尔值。但是,在设置值时,会发生ClassCastException。

java.lang.ClassCastException     在javax.el.ArrayELResolver.setValue(ArrayELResolver.java:260)

在Managed Bean中:

return

在JSF中:

enrollarr = new boolean[this.student.size()];

 public boolean[] getEnrollarr() {
    return enrollarr;
}

public void setEnrollarr(boolean[] enrollarr) {
    this.enrollarr = enrollarr;
}

1 个答案:

答案 0 :(得分:1)

你的问题中有一些不同的问题。

首先:数组的大小永远不会在运行时设置。数组必须在运行时之前分配内存。这意味着你的:

 enrollarr = new boolean[this.student.size()];

永远不会奏效。您尝试在运行时分配内存。

对于这种情况,我建议使用一个ArrayList,用这样的布尔填充它。

 List<boolean> enrollList = new ArrayList<>;

..并用他的功能添加vaules。

enrollList.add(new boolean(true));

这可能无法避免classCast案例。

所以第二个:我猜你的类演员会被扔到这里:

<td><h:selectBooleanCheckbox value="#{adminController.enrollarr[myvar.index]}" /></td>

您尝试调用 adminController。(get / set)enrollarr [myvar.index] ...但此函数不存在。

“翻译”frontEnd尝试调用 adminController.setEnrollarr(true),我们可以看到:没有像 .setEnrollarr(boolean)这样的函数 .setEnrollarr(布尔[])]

第三:但总的来说,我认为你的建设有点困惑。将注册 - 布尔值移动到Student类会更容易。然后你可以像其他变量一样调用它:

 <ui:repeat var="value" value="#{adminController.student}" varStatus="myvar" >
            <tr>
                <td>#{value.name}</td>  
                <td>#{value.TP}</td> 
                <td>#{value.gender}</td> 
                <td><h:selectBooleanCheckbox value="#{value.enroll}" /></td>
            </tr>
</ui:repeat>

这里是你的Stundent课程的补充。请注意:布尔getter以“is”开头。

 public class Student{

    public boolean enroll;

    public boolean isEnroll() {
        return enroll;
    }

    public void setEnroll(boolean enroll) {
        this.enroll = enroll;
    }

 }

希望我的衣服可以带来一些清晰,并帮助你走得更远!