尝试使用ajax,NPE验证密码相等性

时间:2015-05-15 20:29:09

标签: validation jsf primefaces passwords

您好我已经在这里阅读了一些关于使用ajax在jsf中确认密码的线程。然而,当我尝试从确认的密码中获取字符串时,我正在尝试获取NPE。我不知道为什么,但在我尝试渲染图标说测试失败之前它已经有效了。所以我假设当我尝试使用ajax渲染图标时,由于确认密码字段为空,因此会出现异常。但是,即使在将值分配给字符串confirmPassword之前进行了测试,错误仍然存​​在。

我的表格:                                   

            <!-- password -->           

            <tr><td>
            <h:outputLabel for="password">#{registering.Password}</h:outputLabel></td><td>
            <p:password id="password" value="#{subscribeUser.user.password}" feedback="true"
                inline="true"
                promptLabel="#{registering.PleaseEnterPass}" weakLabel="#{registering.Weak}"
                goodLabel="#{registering.Good}" strongLabel="#{registering.Strong}"
                requiredMessage="#{registering.reqPassword}"
                validator="#{passwordValidator.validate}">
                <f:attribute name="confirm" value="#{confirmPassword}" />

<!-- This event leads to NPE -->
                <f:ajax event="blur" render="passwordCheck"></f:ajax>                   
            </p:password></td><td>

<!-- Here are the icons which "create" the NPE -->
            <h:panelGroup id="passwordCheck"  >
                <h:graphicImage library="images/icons" name="failed_indicator.png" rendered="#{passwordValidator.isIndicatorVisible.usernameFailed}"></h:graphicImage>
                <h:graphicImage library="images/icons" name="success_indicator.png" rendered="#{passwordValidator.isIndicatorVisible.usernameSuccess}"></h:graphicImage>
            </h:panelGroup></td><td>
            <span class="error"><h:message id="passwordMessage" for="password"/></span></td>
            </tr>           

            <!-- Confirm password -->

            <tr><td>
            <h:outputLabel for="confirmPassword" value="Confirm password : " /></td><td>
            <p:password id="confirmPassword" required="true"
                requiredMessage="#{registering.PleaseConfirmPassword}" 
                validator="#{passwordValidator.validate}"
                binding="#{confirmPassword}">
                <f:ajax event="blur" execute="password confirmPassword" render="passwordMessage passwordConfMessage"/>                      
                </p:password> </td><td></td><td>
            <span class="error"><h:message id="passwordConfMessage" for="confirmPassword"/></span></td>
            </tr>

        </table>
        <h:commandButton value="Submit" action="#{subscribeUser.inscrireUser}"></h:commandButton>

    </h:form>

我的验证器bean:

  @ManagedBean
public class PasswordValidator implements Validator {

    private Map<String, Boolean> isIndicatorVisible;

    public PasswordValidator() {
        this.isIndicatorVisible = new HashMap<>();
        this.isIndicatorVisible.put("passwordSuccess", false);
        this.isIndicatorVisible.put("passwordFailed", false);
    }

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

        String password = value.toString();
        UIInput uiInputConfirmPassword = (UIInput) component.getAttributes()
                .get("confirm");
        String confirmPassword = uiInputConfirmPassword.getSubmittedValue()
                .toString(); //this line error

错误就在这条线上

        if (password == null || password.isEmpty() || confirmPassword == null
                || confirmPassword.isEmpty()) {
            this.isIndicatorVisible.replace("passwordFailed", false);
            this.isIndicatorVisible.replace("passwordSuccess", true);
            return;
        }
        if (password.length() < 6) {
            uiInputConfirmPassword.setValid(false);
            this.isIndicatorVisible.replace("passwordSuccess", false);
            this.isIndicatorVisible.replace("passwordFailed", true);
            throw new ValidatorException(new FacesMessage(
                    "Your password must be at least 6 characters long."));
        }
        if (!password.equals(confirmPassword)) {
            uiInputConfirmPassword.setValid(false);
            this.isIndicatorVisible.replace("passwordSuccess", false);
            this.isIndicatorVisible.replace("passwordFailed", true);
            throw new ValidatorException(new FacesMessage(
                    "Passwords don't match."));
        }
    }

    public Map<String, Boolean> getIsIndicatorVisible() {
        return isIndicatorVisible;
    }
}

那些测试给出了值2a和2b。

    if (component.getAttributes().get("confirm") == null) {
        System.out.println("1a");
    } else {
        System.out.println("2a");
    }

    if (((UIInput) component.getAttributes().get("confirm"))
            .getSubmittedValue().toString() == null) {
        System.out.println("1b");
    } else {
        System.out.println("2b");
    }

然而第二次测试&#34; b&#34;给了我一个NPE。

0 个答案:

没有答案