JSF 2中自定义验证中的空指针异常

时间:2013-03-08 10:16:35

标签: ajax jsf-2 richfaces

我有3小时: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);
            }           
    }

}

1 个答案:

答案 0 :(得分:1)

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

validateNumber方法中,第三个参数是开始日期。结束日期尚未转换/验证。您需要手动抓取 请求参数映射

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

(其中formId是您父id的{​​{1}}; <h:form>是一个可怕的选择,而是选择更明智和自我的东西-documenting,例如id2

作为组件树的提交值:

end

另见: