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

标签 jsf error-handling ejb validation

根据this问题的答案,我知道如果发生错误,EJB将抛出一个异常,该异常将在后备bean中捕获,并且后备bean将根据异常的捕获向用户显示错误消息。

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

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

注意:验证必须在EJB中

最佳答案

您不应该在支持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不应在此处引发异常。仅当出现致命的和不可恢复的错误(例如数据库关闭或错误的表/列定义)时,才应这样做。

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

}

关于jsf - 在EJB中进行验证时,如何在jsf中显示多条错误消息?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/10855607/

相关文章:

java - 由 : java. lang.ClassNotFoundException 引起:日志

java - 使用 CDI (Seam 3) View 范围时的 JSF 转换器范围

grails - EJB从grails到glassfish的调用

java - 在 Alfresco Explorer 中将结果导出到 Excel

jsf - p :selectOneMenu dropdown part scrolls and does not stay in position

laravel - Illuminate\Database\QueryException SQLSTATE [23000] : Integrity constraint violation: 19 NOT NULL constraint failed

javascript - Uncaught ReferenceError : platform is not defined

jsf - Primefaces selectOneRadio Ajax

jsf - primefaces 数据表 rowedit 不更新单元格元素

asp.net-mvc - 使用操作筛选器属性的ASP.Net MVC错误处理