这是我的jsfpage中的列表框:
<h:selectOneListbox id="stud" value="#{inschrijven.student.studentnr}">
<f:selectItems value="#{inschrijven.gezochteStudenten}" var="st" itemLabel="#{st.studentnr}" itemValue="#{st.studentnr}"/></h:selectOneListbox>
in my managedBean Inschrijven.java:
private Student student;
private List<Student> gezochteStudenten;
在我的构造函数中,我创建了student属性:
student = new Student();
所以首先我搜索student => gezochteStudenten这个工作,我调试了,它工作得像它应该的…
但是当我点击按钮"schrijfin"它给出了一个异常,它甚至不会去我的方法:j_idt9:stud: Validation Error: Value is not valid
知道这是怎么可能的,我怎么能解决这个问题吗?
属性studentnr位于类型"String"的两侧,所以这不会是问题…
在表单提交请求的验证阶段,JSF基本上会重复选择项值,并使用Object#equals()
方法将提交的值与之进行比较。如果提交的值与任何选择项的值不匹配,那么您将得到这个验证错误。
在您的特殊情况下,此验证错误表明#{inschrijven.gezochteStudenten}"
在处理表单提交请求期间返回的列表与在显示表单期间返回的列表不完全相同。这反过来表明您的#{inschrijven}
管理bean是请求作用域,并且属性gezochteStudenten
在bean的(后)构造期间没有填充,而是在前一个操作的某些事件方法期间填充。当响应完成并在表单提交请求期间构造一个全新的bean时,请求作用域bean将被废弃。
<f:selectItems>
声明暗示您正在使用JSF 2。x (var
属性是在JSF 2.0中引入的),因此您可以利用新的JSF 2.0 视图作用域。如果将#{inschrijven}
托管bean放在视图作用域中,则应该可以解决这个问题。然后,在处理表单提交期间将使用与显示表单期间相同的bean。
@ManagedBean
@ViewScoped
public class Inschrijven {
// ...
}