2013-03-25 67 views
0

我試圖驗證裏面的選擇列表,以便不超過1項可以添加到選擇列表。但是當我在pickList.Can中使用驗證器方法時,我遇到了以下錯誤:任何一個提示我我做錯了什麼?java.lang.IllegalAccessException:類javax/faces /組件/ UIComponentBase非法訪問「」類控制器/ testManagedBean

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

異常看起來非常簡單:您試圖在組件的生命週期中添加驗證程序太遲。另外,雖然我不能在這方面權威地發表意見,但我認爲驗證者實例不可能是匿名的。在JSF中每次出現驗證器都需要某種id,即可能需要它可獨立尋址爲bean或頂級方法。它只是更安全,或者指定確認爲在領料單

<p:pickList id="pickList" validator="#{pickListBean.validateSelection}" value="#{pickListBean.cities}" var="city" itemLabel="#{city}" itemValue="#{city}" /> 

而且支持bean一個validator無論是作爲

  1. 方法定義,作爲最高級的方法:

    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");      
        } 
        } 
    }