我有以下FacesValidator:
@RequestScoped
@FacesValidator("passwordValidator")
public class PasswordValidator implements Validator {
@PersistenceUnit(unitName = "TradeCenterPU")
private EntityManagerFactory emf;
@Override
public void validate(final FacesContext context, final UIComponent comp, final Object values) throws ValidatorException {
String password = (String)values;
System.out.println("passwordValidator():" + password);
EntityManager em = emf.createEntityManager();
Query q = em.createNamedQuery("user.findByUsername");
q.setParameter("username", context.getExternalContext().getRemoteUser());
User user = (User)q.getSingleResult();
String pwhash = DigestUtils.md5Hex(password + user.getSalt());
System.out.println("User: " + user.getUsername() + ", PwHash: " + pwhash + ", Password: " + user.getPassword());
if (!pwhash.equals(user.getPassword())) {
System.out.println(comp.getClientId(context) + ": Old password is wrong!");
FacesMessage msg = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"The old password was not entered correctly.",
""
);
context.addMessage(comp.getClientId(context), msg);
throw new ValidatorException(msg);
}
}
}
以下列方式使用:
<h:form id="profileform" action="#{userController.updatePassword}">
<h:messages errorClass="error_message" globalOnly="true"/>
...
<h:outputLabel for="password" value="Old password:" />
<h:inputSecret id="password" name="password" label="Old password">
<f:validateLength minimum="8" maximum="15" />
<f:validator validatorId="passwordValidator"/>
</h:inputSecret>
<h:message for="password" errorClass="error_message"/>
...
</h:form>
现在的问题是,Validator生成的消息永远不会显示。我知道它会生成,因为在Glassfish-Log中我可以看到
profileform:password: Old password is wrong!
我看不到任何错误,特别是因为如果密码是长或短,则会显示f:validateLength
的消息。
如果我做
context.addMessage(null, msg);
而不是
context.addMessage(comp.getClientId(context), msg);
消息显示在h:messages
组件中。
有人有想法吗?提前致谢
答案 0 :(得分:5)
您什么也没看到,因为您构建了FacesMessage
,其中包含摘要和详细信息。如果详细信息不是null
,则会显示详细信息。由于您使用空字符串设置它,因此您“看到”一条空消息。您基本上需要将详细信息设置为null
以显示摘要。
但这并不是你应该在验证错误上设置消息的方式。您应只抛出ValidatorException
,JSF会根据组件的客户端ID将ValidatorException
构造的消息添加到上下文中。
所以,你需要替换
FacesMessage msg = new FacesMessage(
FacesMessage.SEVERITY_ERROR,
"The old password was not entered correctly.",
""
);
context.addMessage(comp.getClientId(context), msg);
throw new ValidatorException(msg);
通过
String msg = "The old password was not entered correctly.";
throw new ValidatorException(new FacesMessage(msg));
它将按预期工作。