我正在尝试在选项列表中进行验证,因此可以将不超过1个项目添加到选项列表中。但是当我在pickList中使用验证方法时,我得到以下错误。任何人都建议我做错了什么?
java.lang.IllegalAccessException: Class javax/faces/component/UIComponentBase illegally accessing " " class controller/testManagedBean$1
at java.lang.J9VMInternals.newInstanceImpl(Native Method)
at java.lang.Class.newInstance(Class.java:1355)
at javax.faces.component.UIComponentBase.restoreAttachedState(UIComponentBase.java:1598)
public void onTransfer(TransferEvent event) {
PickList picklist = (PickList) event.getComponent();
picklist.addValidator(new Validator() {
@Override
public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
throws ValidatorException {
System.out.println("test");
}
});
答案 0 :(得分:0)
异常看起来非常简单:您试图在组件的生命周期中添加验证器太晚。此外,虽然我不能权威地谈论这个,但我认为验证器实例不可能是匿名的。 JSF中每次出现的验证器都需要某种id,即它可能要求它可以作为bean或顶级方法独立寻址。将验证指定为validator
或
选项列表上的方法定义
<p:pickList id="pickList" validator="#{pickListBean.validateSelection}" value="#{pickListBean.cities}" var="city" itemLabel="#{city}" itemValue="#{city}" />
在你的支持bean上,作为顶级方法:
public void validateSelection(FacesContext arg0, UIComponent arg1, Object arg2)
throws ValidatorException {
System.out.println("test");
}
}
Validator的完全独立实现
@FacesValidator("myValidator")
MyValidator implements Validator{
public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
throws ValidatorException {
System.out.println("test");
}
}
}