【问题标题】:Null Pointer Exception in custom validation in JSF 2JSF 2 中自定义验证中的空指针异常
【发布时间】:2013-03-08 10:16:35
【问题描述】:

我有 3 个 h:inputText :名称、起始编号和结束编号。

我有两个自定义验证函数 validateName 和 validateNumber,如 Bean 类所示。 函数调用如 show.xhtml 所示。

其中 validateName() 运行成功但在 validateNumber() 处生成错误如下:

show.xhtml @83,93 validator="#{myBean.validateNumber}": java.lang.NullPointerException

第 83 行是:

<h:inputText id="idstart" value="#{myBean.start}" validator="#{myBean.validateNumber}"/>

show.xhtml:

<h:inputText id="name" required="true" requiredMessage="Name cannot be empty!" value="#{myBean.name}" validator="#{myBean.validateName}">
<rich:message for="name"/>

<h:inputText id="idstart" value="#{myBean.start}" validator="#{myBean.validateNumber}"/>
<rich:message for="id1"/>

<h:inputText id="id2" value="#{myBean.end}" />

SessionScoped bean:

import javax.faces.application.Application;
import javax.faces.validator.ValidatorException;
public class MyBean
{
private Integer start;
private Integer end;
private String name;

public void validateName(FacesContext context,UIComponent component,Object value)throws ValidatorException
    {
        String name=value.toString();
        /*Code for having Unique name */
        FacesMessage msg = new FacesMessage("Unique Validation failed","Name used is already existing");
                 msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                 throw new ValidatorException(msg);
            }           
        }
    }

public void validateNumber(FacesContext context,UIComponent component,Object value)throws ValidatorException
    {

        if(start > end)
            {
            FacesMessage msg = new FacesMessage("Number Validation failed","Start Number Should be less the End Number");
                 msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                 throw new ValidatorException(msg);
            }           
    }

}

【问题讨论】:

  • 嗯,可能start 和/或endnull。调试这个。你在哪里初始化这两个我看不到的变量?
  • 你的 bean 中有 setStart 和 setEnd 方法吗?
  • 像这样的非系统性 NPE 几乎肯定是由您忽略的某些事情引起的。你确定你的 bean 被声明为@SessionScoped 吗? value 不为空?在此处发布完整的堆栈跟踪

标签: ajax jsf-2 richfaces


【解决方案1】:

您不应该直接从验证器内部访问 bean 的属性。那时它们还没有被设置。 JSF 需要在更新模型值(阶段 4)之前首先处理验证(阶段 3)。相反,您应该从验证器方法的第三个参数或组件树中获取值。

在您的validateNumber 方法中,第三个参数是开始日期。结束日期当时尚未转换/验证。您需要从请求参数映射 either 中手动获取它,

String end = context.getExternalContext().getRequestParameterMap().get("formIc:id2");

(其中formId 是您父母&lt;h:form&gt;id;顺便说一句,id2 是一个糟糕的选择,而是选择更明智和自我记录的东西,例如end )

作为来自组件树的提交值:

UIForm formComponent = (UIForm) component.getNamingContainer();
UIInput endComponent = (UIInput) formComponent.findComponent("id2");
String end = endComponent.getSubmittedValue();

另见:

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-01
    • 1970-01-01
    • 2013-03-04
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多