java.lang.IllegalAccessException:类javax / faces / component / UIComponentBase非法访问“”类控制器/ testManagedBean

时间:2013-03-25 13:41:19

标签: jsf-2 primefaces

我正在尝试在选项列表中进行验证,因此可以将不超过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");                     
            }
        });

1 个答案:

答案 0 :(得分: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. Validator的完全独立实现

    @FacesValidator("myValidator")
    MyValidator implements Validator{
    
    public void validate(FacesContext arg0, UIComponent arg1, Object arg2)
                throws ValidatorException {
            System.out.println("test");                     
        }
      }
    }