ClassCastException:在设置布尔数组值jsf中重复索引
ClassCastException: uirepeat index in setting the boolean array value jsf
数组大小取决于运行时的学生大小。我能够基于数组布尔值在 JSF 中的 selectBooleanCheckbox 上有效地显示布尔值。但是,在设置该值时,会发生ClassCastException。
java.lang.ClassCastException
在 javax.el.ArrayELResolver.setValue(ArrayELResolver.java:260)
在托管 Bean 中:
enrollarr = new boolean[this.student.size()];
public boolean[] getEnrollarr() {
return enrollarr;
}
public void setEnrollarr(boolean[] enrollarr) {
this.enrollarr = enrollarr;
}
在 JSF 中:
<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="#{adminController.enrollarr[myvar.index]}" /></td>
</tr>
</ui:repeat>
你的问题有一些不同的问题。
首先:数组的大小永远不能在运行时设置。数组必须在运行前分配内存。这意味着您的:
enrollarr = new boolean[this.student.size()];
永远行不通。您尝试在运行时分配内存。
对于这种情况,我建议使用 ArrayList 并用这样的布尔值填充它。
List<boolean> enrollList = new ArrayList<>;
..并用他的函数添加值。
enrollList.add(new boolean(true));
这可能无法避免 classCast 案例。
所以第二个: 我猜你的 class 投射在这里:
<td><h:selectBooleanCheckbox value="#{adminController.enrollarr[myvar.index]}" /></td>
您尝试调用adminController。(get/set)enrollarr[myvar.index]...但是这个函数不存在。
"Translated" 前端尝试调用 adminController.setEnrollarr(true),正如我们所见:没有像 这样的函数。仅 setEnrollarr(boolean)
.setEnrollarr(boolean[])].
第三: 但总的来说,我认为你的结构有点混乱。将您 enroll- 布尔值移动到学生 class 会容易得多。然后你可以像其他变量一样调用它:
<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 class 的补充。请注意:布尔值 getter 以 "is".
开头
public class Student{
public boolean enroll;
public boolean isEnroll() {
return enroll;
}
public void setEnroll(boolean enroll) {
this.enroll = enroll;
}
}
希望我的回答能给你带来一些清晰,帮助你走得更远!
数组大小取决于运行时的学生大小。我能够基于数组布尔值在 JSF 中的 selectBooleanCheckbox 上有效地显示布尔值。但是,在设置该值时,会发生ClassCastException。
java.lang.ClassCastException 在 javax.el.ArrayELResolver.setValue(ArrayELResolver.java:260)
在托管 Bean 中:
enrollarr = new boolean[this.student.size()];
public boolean[] getEnrollarr() {
return enrollarr;
}
public void setEnrollarr(boolean[] enrollarr) {
this.enrollarr = enrollarr;
}
在 JSF 中:
<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="#{adminController.enrollarr[myvar.index]}" /></td>
</tr>
</ui:repeat>
你的问题有一些不同的问题。
首先:数组的大小永远不能在运行时设置。数组必须在运行前分配内存。这意味着您的:
enrollarr = new boolean[this.student.size()];
永远行不通。您尝试在运行时分配内存。
对于这种情况,我建议使用 ArrayList 并用这样的布尔值填充它。
List<boolean> enrollList = new ArrayList<>;
..并用他的函数添加值。
enrollList.add(new boolean(true));
这可能无法避免 classCast 案例。
所以第二个: 我猜你的 class 投射在这里:
<td><h:selectBooleanCheckbox value="#{adminController.enrollarr[myvar.index]}" /></td>
您尝试调用adminController。(get/set)enrollarr[myvar.index]...但是这个函数不存在。
"Translated" 前端尝试调用 adminController.setEnrollarr(true),正如我们所见:没有像 这样的函数。仅 setEnrollarr(boolean) .setEnrollarr(boolean[])].
第三: 但总的来说,我认为你的结构有点混乱。将您 enroll- 布尔值移动到学生 class 会容易得多。然后你可以像其他变量一样调用它:
<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 class 的补充。请注意:布尔值 getter 以 "is".
开头 public class Student{
public boolean enroll;
public boolean isEnroll() {
return enroll;
}
public void setEnroll(boolean enroll) {
this.enroll = enroll;
}
}
希望我的回答能给你带来一些清晰,帮助你走得更远!