Пользовательский валидатор JSF: h: сообщение не отображается - PullRequest
2 голосов
/ 29 мая 2011

У меня есть следующий 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>

Проблема в том, что сообщение, которое генерирует Валидатор, никогда не отображается. Я знаю, что это генерируется, потому что в журнале Glassfish-Log я вижу

profileform:password: Old password is wrong!

Я не вижу в этом никакой ошибки, тем более что сообщение для f:validateLength отображается, если пароль длинный или короткий. Если я сделаю

context.addMessage(null, msg);

вместо

context.addMessage(comp.getClientId(context), msg);

Сообщение показывается в компоненте h:messages. У кого-нибудь есть идея? Заранее спасибо

1 Ответ

5 голосов
/ 29 мая 2011

Вы ничего не видите, потому что вы создали FacesMessage со сводкой и детали.Если деталь не null, она будет отображаться вместо.Поскольку вы установили его с пустой строкой, вы «видите» пустое сообщение.В основном вам нужно установить детализацию на null, чтобы отобразить сводку.

Но это не совсем тот способ, которым вы должны установить сообщение об ошибке проверки.Вы должны просто сгенерировать ValidatorException, и JSF добавит созданное сообщение 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));

и все будет работать, как вы ожидаете.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...