您好我已经在这里阅读了一些关于使用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。