代码之家  ›  专栏  ›  技术社区  ›  Thraydor

当HtmlInputText组件不为空时,“无法验证具有空值的组件”警告

  •  1
  • Thraydor  · 技术社区  · 7 年前

    在WAS 8.5、IceFaces 3.3(JSF 2.1-MyFaces 2.1.17)上运行

    <f:facet name="body">
        <ice:panelGrid columns="3">
            <ice:outputText value="User Id"></ice:outputText>
            <ice:inputText id="CreateNewUserPopUp-UserId" binding="#{menuBean.userPanel.userN}" action="#{menuBean.userPanel.checkUserId}"
                disabled="#{menuBean.userPanel.validUserId and !menuBean.userPanel.userIdExists}" maxlength="30" value="#{menuBean.userPanel.userN}">
            </ice:inputText>
            <ice:message for="CreateNewUserPopUp-UserId" id="CreateNewUserPopUp-UserIdMessage" style="color: Red; font-style: italic; font-size: 12px;"/>
    
            <ice:outputText value="User Name"></ice:outputText>
            <ice:inputText id="CreateNewUserPopUp-UserName"  binding="#{menuBean.userPanel.userNameT}" 
                disabled="#{!menuBean.userPanel.validUserId or (menuBean.userPanel.validUserId and menuBean.userPanel.userIdExists)}"
                style="width:300px" maxlength="30">
            </ice:inputText>
            <ice:message for="CreateNewUserPopUp-UserName" id="CreateNewUserPopUp-UserNameMessage" style="color: Red; font-style: italic; font-size: 12px;"/>
            ...
            ...
        </ice:panelGrid>
    </f:facet>
    

    private HtmlInputText userN;
    private HtmlInputText userNameT
    

    呈现弹出框时,所有字段都会初始化,并为用户Id输入框请求焦点

    public void clearNewUser()
    {
        setValidUserId(false);
        setUserIdExists(false);
        getUserN().setValue("");
        getUserNameT().resetValue();
        ...
        ...
        getUserN().requestFocus();
    }
    

    public void checkUserId()
    {
        ...
        ...
        if (getUserN().getValue().toString().trim().length() < 1)
        {
            setMessage("User Id required");
        }
        else
        {
            DtcUsersTable dtcUsersTable = usersTableService.findById(getUserN().getValue().toString().toLowerCase());
    
            if (dtcUsersTable != null)
            {
                setValidUserId(true);
                setUserIdExists(true);
                setMessage("User Already Exists");
            }
            else
            {
                setValidUserId(true);
                setUserIdExists(false);
                getUserNameT().requestFocus();
                setMessage("Please Enter User Details");
            }
        }
    }
    

    如果输入框为空,则会正确显示我给用户的警告消息,说明“需要用户Id”。

    如果我填充该框并按ENTER键,我的所有处理都会正确完成,输入框会被验证和禁用,因此在验证后无法编辑用户ID,用户名输入框会被选择为新焦点。 然后控制台日志中会显示一条消息,说明:

    000001a1 BeanValidator W   cannot validate component with empty value: APP:CreateNewUserPopUp-UserId
    

    0000019d BeanValidator W   cannot validate component with empty value: APP:CreateNewUserPopUp-UserName
    

    有人知道我能做些什么来解决这个问题吗?

    1 回复  |  直到 7 年前
        1
  •  1
  •   Thraydor    7 年前

    我找到了答案。它在抱怨 value 属性。

    我已经改变了 userN userNameT 成为 String 然后把他们转移到 所有物我还将两个新命名的组件添加到 binding

    <f:facet name="body">
        <ice:panelGrid columns="3">
            <ice:outputText value="User Id"></ice:outputText>
            <ice:inputText id="CreateNewUserPopUp-UserId" binding="#{menuBean.userPanel.userInputN}" action="#{menuBean.userPanel.checkUserId}"
                disabled="#{menuBean.userPanel.validUserId and !menuBean.userPanel.userIdExists}" maxlength="30"
                value="#{menuBean.userPanel.userN}">
            </ice:inputText>
            <ice:message for="CreateNewUserPopUp-UserId" id="CreateNewUserPopUp-UserIdMessage" style="color: Red; font-style: italic; font-size: 12px;"/>
    
            <ice:outputText value="User Name"></ice:outputText>
            <ice:inputText id="CreateNewUserPopUp-UserName"  binding="#{menuBean.userPanel.userNameInputT}" 
                disabled="#{!menuBean.userPanel.validUserId or (menuBean.userPanel.validUserId and menuBean.userPanel.userIdExists)}"
                style="width:300px" maxlength="30"
                value="#{menuBean.userPanel.userNameT}">
            </ice:inputText>
            <ice:message for="CreateNewUserPopUp-UserName" id="CreateNewUserPopUp-UserNameMessage" style="color: Red; font-style: italic; font-size: 12px;"/>
            ...
            ...
        </ice:panelGrid>
    </f:facet>
    

    我在Java类中添加了2个新的HtmlInputText组件

    private HtmlInputText userNameInputT;
    private HtmlInputText updateUserNameInputT;
    
    private String userN;
    private String userNameT;
    

    更新了初始化字段的方法

    public void clearNewUser()
    {
        setValidUserId(false);
        setUserIdExists(false);
        setUserN("");
        setUserNameT("");
        ...
        ...
        getUserInputN().requestFocus();
    }
    

    更新了请求焦点的验证代码,并更改了用于 .getValue().toString() 在输入字段上。因为它们现在是字符串,所以不需要这样做。

    public void checkUserId()
    {
        ...
        ...
        if (getUserN().trim().length() < 1)
        {
            setMessage("User Id required");
        }
        else
        {
            ...
            ...
            else
            {
                setValidUserId(true);
                setUserIdExists(false);
                getUserNameInputT().requestFocus();
                setMessage("Please Enter User Details");
            }
        }
    }