【问题标题】:JSF custom UISelectOne POSTback error ; Validation Error: Value is not validJSF 自定义 UISelectOne POSTback 错误;验证错误:值无效
【发布时间】:2017-10-31 03:12:39
【问题描述】:

我在自定义 UISelectOne 组件中有问题。我的目的是创建包含自己数据的新自定义组件。所以我在组件的 costactor 方法中创建了虚拟数据访问,如下所示。当我将控件放入 XHTML 文件时,它在第一次加载页面时可以正常工作,但是当我单击提交 HTML 页面的按钮时,会出现错误并出现警告。错误和警告消息如下所示;

顺便说一句,我见过一些类似的问题。但是它们都不是关于自定义控制的,我无法解决我的问题。正如我所说,我想在组件自己的承包商中加载数据。所以我认为我的情况似乎有所不同。

) 警告:FacesMessage(s) 已入队,但可能尚未入队 显示。 sourceId=j_idt6:j_idt7[严重性=(错误 2), 摘要=(j_idt6:j_idt7:验证错误:值无效), detail=(j_idt6:j_idt7: 验证错误: 值无效)]

所以我的控制和格式化代码:

@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 方法在 postbak 后触发了两次。不知道正常不正常?

@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();

    }

}

实际上我不确定我应该在哪里加载数据并且应该设置转换器类。我的理解是;问题是因为回发前后的数据匹配。但我不知道该怎么办?

最好的问候。

【问题讨论】:

    标签: jsf-2


    【解决方案1】:

    您好,我找到了解决方案。我已经覆盖了 Value Class 的 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;
        }
    

    【讨论】:

      猜你喜欢
      • 2017-11-10
      • 2011-09-13
      • 2013-05-20
      • 2013-04-08
      • 2011-06-01
      • 2011-07-21
      • 2011-07-28
      • 2012-05-11
      相关资源
      最近更新 更多