2017-05-30 9 views
0

カスタムUISelectOneコンポーネントに問題があります。私の目的は、独自のデータを含む新しいカスタムコンポーネントを作成することです。だから私は、以下のように、コンポーネントのcostactorメソッドでデータアクセスを作成しました。私はコントロールをXHTMLファイルに配置すると、ページの最初の読み込みで正しく機能しますが、HTMLページのボタンをサブビューするときにクリックするとエラーが発生し、警告が表示されます。エラーメッセージと警告メッセージは以下のようになります。JSFカスタムUISelectOne POSTbackエラー。検証エラー:値が無効です

ところで私はいくつかの類似した問題を見てきました。しかし、それらのどれもカスタムコントロールに関するものではなく、私は自分の問題を解決できませんでした。私が言ったように、私はコンポーネントの請負業者にデータをロードしたい。だから私の状況は違うと思う。

) WARNING: FacesMessage(s) have been enqueued, but may not have been displayed. sourceId=j_idt6:j_idt7[severity=(ERROR 2), summary=(j_idt6:j_idt7: Validation Error: Value is not valid), detail=(j_idt6:j_idt7: Validation Error: Value is not valid)]

ので、私のコントロールとフォーマッタコード:

@Named("ABankAccountList") 
@RequestScoped 
@FacesComponent(createTag = true, namespace = "http://abank.com.tr/example", tagName = "ABankAccountList", value = "com.abank.customcontrols.ABankAccountList") 
public class ABankAccountList extends UISelectOne { 



    private List<Account> accounts; 

    public ABankAccountList() { 

     this.setConverter(new AccountConverter()); 
     accounts=new ArrayList<Account>(); 
     Account tempAcc = null; 
     for (int i = 5; i < 8; i++) { 
      tempAcc = new Account(); 
      tempAcc.setAccountId(i); 
      tempAcc.setAccountNumber(i + "0456-789"); 
      tempAcc.setCurrencyCode("TRY"); 
      tempAcc.setIbanNumber("TR-" + i + "-98583213213223"); 
      accounts.add(tempAcc); 

     } 

    } 

    public List<Account> getAccounts() { 
     return accounts; 
    } 

    public void setAccounts(List<Account> accounts) { 
     this.accounts = accounts; 
    } 

    // After POST Back 
    @Override 
    public void decode(FacesContext context) { 


     super.decode(context); 


    } 

    @Override 
    public void encodeBegin(FacesContext context) throws IOException { 

     if (context.isPostback()) 
     { 
      return ; 

     } 

     UISelectItems selectItems = new UISelectItems(); 

     List<SelectItem> result = new ArrayList<SelectItem>(); 
     try { 

      for (Account account : accounts) { 
       SelectItem item = new SelectItem(account, account.getAccountNumber()); 
       result.add(item); 

      } 

     } catch (Exception e) { 
      // log.error("Failed to create enum list", e); 
     } 


     getChildren().clear(); 

     selectItems.setValue(result); 
     getChildren().add(selectItems); 






    } 

    // Render HTML 
    @Override 
    public void encodeEnd(FacesContext context) throws IOException { 


     super.encodeEnd(context); 
    } 



} 

また、私は以下のようにConvertetクラスを持っています。 そして、コードをデバッグすると、ポストバックの後にgetAsObjectメソッドが2回発生することがわかりました。私はそれが正常かどうか分からないのですか?

@FacesConverter(value = "AccountConverter") 
public class AccountConverter implements Converter 
{ 

    @Override 
    public Object getAsObject(FacesContext context, UIComponent uiComponent, String arg2) 
    { 

     ValueExpression vex = context.getApplication().getExpressionFactory() .createValueExpression(context.getELContext(),  
       "#{ABankAccountList}", ABankAccountList.class); 

     ABankAccountList contoller = (ABankAccountList)vex.getValue(context.getELContext()); 
     Account rAccount=null; 
     for (Account acc : contoller.getAccounts()) { 
       if (arg2.toString().equals(acc.getAccountId().toString())) { 
        rAccount = acc; 
       } 
      }   

      return rAccount; 
    } 

    @Override 
    public String getAsString(FacesContext arg0, UIComponent arg1, Object account) { 
     Account accctemp=((Account)account); 
     Integer accid=accctemp.getAccountId(); 
     return accid.toString(); 

    } 

} 

は、実際に私は、私は、データをロードする必要があるとwhreerはConverterクラスを設定しなければならない場所について確認していません。私が理解しているのは、問題は、ポストバックの前後でデータが一致しているためです。しかし、私は何をすべきか分かりません。

よろしくお願いいたします。

答えて

0

こんにちは私は解決策を見つけました。私はValueクラスのequalsメソッドをオーバーライドしました。

@Override 
    public boolean equals(Object obj) { 
     if (obj == null) 
      return false; 
     if (obj instanceof Account) 
     { 
      Account other = (Account) obj; 
      if (other.getAccountId() == this.getAccountId() 
       && other.getIbanNumber() == this.getIbanNumber()  
        ) 
       return true; 
     } 
     return false; 
    } 
関連する問題