如何在EJB中进行验证时在jsf中显示多个错误消息?

时间:2012-06-01 18:35:15

标签: jsf error-handling ejb validation

基于this问题的答案,我理解如果出现错误,EJB将抛出一个异常,它将在后备bean中捕获,而后备bean将根据异常向用户显示错误消息捉。

我的问题是,如果有多个错误怎么办?如何向用户显示多条错误消息,而EJB一次只能抛出一个异常?

例如,在注册表单中,用户需要输入电子邮件地址,名称,密码和重新密码,且不得为空。如果所有数据都有效但给定的电子邮件地址已经存在,EJB将抛出EntityExistException,并且将通知用户已经注册了电子邮件地址。如果密码和重新密码等多个错误不匹配且名称为空,该怎么办?我想向用户显示这两个错误。 EJB抛出什么异常?我可以采取什么方法来实现这一目标?

注意:验证必须在EJB

1 个答案:

答案 0 :(得分:2)

您不应该在支持bean操作方法中进行验证,而是在正常的Validator中进行验证。

E.g。

<h:inputText value="#{register.email}" required="true" validator="#{emailValidator}" />
<h:inputSecret binding="#{password}" value="#{register.password}" required="true" />
<h:inputSecret required="true" validator="confirmPasswordValidator">
    <f:attribute name="password" value="#{password.value}" />
</h:inputSecret>
...

#{emailValidator}是这样的:

@MangedBean
public class EmailValidator implements Validator {

    @EJB
    private UserService userService;

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        if (value == null) {
            return; // Let required="true" handle.
        }

        if (userService.existsEmail((String) value)) {
            throw new ValidatorException(Messages.createError("Email already exists"));
        }
    }

}

请注意,EJB不应在此处引发异常。它应该只在出现致命和不可恢复的错误时执行此操作,例如DB down或错误的表/列定义。

confirmPasswordValidator就是这样的

@FacesValidator("confirmPasswordValidator")
public class ConfirmPasswordValidator implements Validator {

    @Override
    public void validate(FacesContext context, UIComponent component, Object value) throws ValidatorException {
        Object password = component.getAttributes().get("password");

        if (value == null || password == null) {
            return; // Let required="true" handle.
        }

        if (!password.equals(value)) {
            throw new ValidatorException(Messages.createError("Password do not match"));
        }
    }

}