p:selectOneMenu验证失败

时间:2013-12-20 15:09:02

标签: jsf java-ee primefaces

我正在使用PrimeFaces SelectOneMenu,如下所示:

    <p:selectOneMenu id="inviteAbleRoleSelect"
            styleClass="dropDownSelector"
            value="#{invitationManagedBean.selectedRole}">
                <f:selectItems value="#{invitationManagedBean.inviteAbleRoles}"
                var="role"
                itemValue="#{role}"
                itemLabel="#{localized[role.concat('RoleName')]}">
                </f:selectItems>
    </p:selectOneMenu>

以下JavaScript调用完成:

function handleUserInvitationRequest(xhr,status,args){
            if (args.validationFailed) {
                jQuery('#userInviterDialog').effect("shake", {
                    times : 3
                }, 70);
            } else {
                userInviterDialogVar.hide();
                refreshInvitedUserList();
            }
        }

当我提交表单时,我得到一个带正确填充表单的ajax POST,但是当它调用处理程序时,validationFailed为true,即使该元素不是必需的。此外,ajax响应中的更改会将select设置为空选择。

有什么想法吗?

2 个答案:

答案 0 :(得分:1)

这是一个完全蹩脚的错误...... 豆是@RequestScoped ...... 至少需要@ViewScoped

答案 1 :(得分:0)

如果你的角色不是String或任何原始类型,那么你可能会得到Validation Error: Value is not valid,因此你需要为你的角色实体/对象实现一个转换器,它就是这样的。

@FacesConverter("roleConverter")
public class RoleConverter implements Converter {


   @Override
   public Object getAsObject(FacesContext context, 
                                 UIComponent component, 
                                 String value) {
       //prepare your datasource ex. EJB .. etc
       if (value.trim().equals("")) {
           return null;
       } else {
           Role role = datasource.findById(value); //get role from database
           retun role;
       }

   }

   @Override
   public String getAsString(FacesContext context, 
                                 UIComponent component, 
                                 Object value)   {
       if (value == null || value.equals("")) {
           return "";
       } else {
           return String.valueOf(((Role) value).getId());
       }
   }

 }

selectOneMenu用于

<p:selectOneMenu id="inviteAbleRoleSelect"
        styleClass="dropDownSelector"
        value="#{invitationManagedBean.selectedRole}" converter="roleConverter">
            <f:selectItems value="#{invitationManagedBean.inviteAbleRoles}"
            var="role"
            itemValue="#{role}"
            itemLabel="#{localized[role.concat('RoleName')]}">
            </f:selectItems>
</p:selectOneMenu>

您需要确保您的Role实现了equals和hashcode。