【问题标题】:"cannot validate component with empty value" warning when HtmlInputText component NOT empty当 HtmlInputText 组件不为空时,“无法验证具有空值的组件”警告
【发布时间】:2018-01-19 19:35:15
【问题描述】:

我正在将应用程序从 Icefaces 1.8 升级到 IceFaces 3.3

在 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>

它绑定到 userN 和 userNameT 的 HtmlInputText 组件:

private HtmlInputText userN;
private HtmlInputText userNameT

当弹出框被渲染时,所有字段都被初始化并且为用户ID输入框请求焦点

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

如果我在 userN 框上按 ENTER,则执行验证代码。

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

我已尝试在线搜索,但无法找到遇到相同问题的其他人。我唯一能想到的就是更改日志级别以防止显示 bean 验证器警告,但这只是在掩盖问题而不是修复它。

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

【问题讨论】:

    标签: java jsf jsf-2 myfaces icefaces-3


    【解决方案1】:

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

    我已将 userNuserNameT 更改为 String 并将它们移动到 value 属性中。我还在 binding 属性中添加了 2 个新命名的组件。

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

    现在一切正常

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-03-19
      • 1970-01-01
      • 2021-07-05
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多