0

我正在尝试在选项列表中进行验证,以便最多可以将 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");                     
            }
        });
4

1 回答 1

0

异常看起来很简单:您试图在组件的生命周期中添加验证器为时已晚。此外,虽然我不能就此发表权威性发言,但我认为验证器实例不可能是匿名的。JSF 中每次出现的验证器都需要某种 id,即它可能要求它可以作为 bean 或顶级方法独立寻址。将验证指定为或者更validator安全

  1. 选择列表上的方法定义

    <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");                     
        }
    }
    
  2. 验证器的完整独立实现

    @FacesValidator("myValidator")
    MyValidator implements Validator{
    
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
                throws ValidatorException {
            System.out.println("test");                     
        }
      }
    }
    
于 2013-03-25T14:08:56.317 回答