【问题标题】:Multi field validation, obtaining value of another component results in NullPointerException多字段验证,获取另一个组件的值导致 NullPointerException
【发布时间】:2013-09-10 20:14:00
【问题描述】:

当我在邮政编码中输入内容并点击提交并将国家/地区设置为默认空值时,我得到 javax.faces.FacesException: java.lang.NullPointerException。如果我选择国家,然后输入一切正常的东西。我尝试了 SubmittedValue,但它的工作方式相反 - null 正在工作,然后给出 null 异常。

@FacesValidator("zipV")
public class ZipValidator implements Validator {

LocaleBean Bean = new LocaleBean();
String language;
private static final String ZIP_PATTERN_BG = "\\d{4}";
private static final String ZIP_PATTERN_US = "\\d{5}";
private static final String ZIP_PATTERN_DEFAULT = "[A-Za-z0-9]*";
private String zip_pattern;
private Pattern pattern;
private Matcher matcher;
private String country;


@Override
public void validate(FacesContext context, UIComponent component, Object value) throws       ValidatorException {

    language = Bean.getLanguage();

    UIInput Input = (UIInput) component.getAttributes().get("country");
    country = Input.getValue().toString();
    String zip = (String) value;


    if (country == null || country.isEmpty()) {
        return; 
    }

    switch (country) {
        case "BGR":
            zip_pattern = ZIP_PATTERN_BG;
            break;
        case "USA":
            zip_pattern = ZIP_PATTERN_US;
            break;
        default:
            zip_pattern = ZIP_PATTERN_DEFAULT;
            break;
    }

    pattern = Pattern.compile(zip_pattern);

    matcher = pattern.matcher(value.toString());
    if (!matcher.matches()) {


        switch (language) {
            case "en": {
                FacesMessage msg = new FacesMessage("Invalid zip.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(msg);
            }
            case "bg": {
                FacesMessage msg = new FacesMessage("Невалиден пощенски код.");
                msg.setSeverity(FacesMessage.SEVERITY_ERROR);
                throw new ValidatorException(msg);
            }
        }
    }
}
}

这是视图:

<h:selectOneMenu id="country" value="#{account.country}" required="true" requiredMessage="#{msg['register.required']}" binding="#{country}">
<f:selectItem itemValue="#{null}" itemLabel="#{msg['register.countryQ']}"/>
<f:selectItems value="#{account.countries}"/>
<f:ajax listener="#{account.loadStates()}" render="state"/>
</h:selectOneMenu>

<h:inputText id="zipcode" required="true" requiredMessage="#{msg['register.required']}" value="#{account.zipcode}">
<f:validator validatorId="zipV"/>
<f:attribute name="country" value="#{country}"/>
</h:inputText>

【问题讨论】:

  • 是 Input.getValue().toString() 上的空指针?
  • 是的,如果我将其更改为 SubmittedValue,它将使用 null 并且在此之后无法使用。
  • 您能解释一下“在此之后”是什么意思吗?你的意思是如果你使用 Input.getSubmittedValue().toString() 那么你没有得到空指针,但是代码在这之后的某个地方不起作用?
  • 我在 zip 表单中键入一个值,然后单击提交 - 我没有得到空指针。我更改国家/地区,然后单击提交 - 我得到空指针。
  • getSubmittedValue() 不是正确的方法。只有在验证器运行组件被处理之前,你才应该使用它。这不是这里的情况。验证器在处理完国家/地区组件之后在 zip 组件上运行。

标签: validation jsf jsf-2.2


【解决方案1】:

这里,

country = Input.getValue().toString();

您根本不应该使用toString()。你应该投射它:

country = (String) Input.getValue();

否则,如果getValue() 返回null,它将抛出NullPointerException。正如its javadoc 明确指出的那样,当您尝试在null 上调用实例方法时,将抛出NullPointerException(就像您对toString() 所做的那样)。

请注意,这个问题在技术上与 JSF 无关。这只是基本的Java。异常的java.lang 包是一个很好的提示。如果您遇到了javax.faces(或javax.el)包的异常,那么我们可以讨论一个真正的JSF(或EL)问题。

另见:


与具体问题无关,我真的很尊重Java naming conventions。变量名以小写字母开头。使用input 而不是Input。此外,您对本地化的手动控制很奇怪。如果您需要支持 10 种语言怎么办?你把开关扩展到所有地方吗?使用带有&lt;resource-bundle&gt;ResourceBundle#getBundle() 的JSF 内置本地化工具。

【讨论】:

  • 感谢帮助。如何让我的 ResourceBundle#getBundle() 从 com.program.messages 而不是根文件夹中获取包。
  • 只需将该值作为基本名称传递。
  • 我试过不行。仅当它们在根中称为 messages.properties 并且值为消息时才有效。 ResourceBundle.getBundle("messages", currentLocale)。我也试过 com/program/messsages/messages... 它不起作用
  • 也许你在做/解释错了。它应该与您在&lt;resource-bundle&gt;faces-config.xml 中指定的值完全相同。另请参阅stackoverflow.com/q/2668161 如果您仍然卡住,请按[] 提出一个新问题。这部分与所提出的具体问题无关。这个问题已经回答了。由于您是新来的,请不要忘记在回答(最)有助于理解和解决问题时将其标记为已接受。另见How does accepting an answer work?
猜你喜欢
  • 2020-09-06
  • 2016-08-01
  • 1970-01-01
  • 2020-11-13
  • 1970-01-01
  • 2011-09-20
  • 1970-01-01
  • 2018-09-04
  • 1970-01-01
相关资源
最近更新 更多