0

根据这个问题的答案,我知道如果出现错误,EJB 将抛出一个异常,该异常将在支持 bean 中捕获,支持 bean 将根据异常向用户显示错误消息。

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

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

注意:验证必须在 EJB 中

4

1 回答 1

2

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

例如

<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 关闭或错误的表/列定义)时才应该这样做。

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"));
        }
    }

}
于 2012-06-01T18:45:25.777 回答