Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/jsf/5.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在EJB中进行验证时,如何在jsf中显示多个错误消息?_Jsf_Error Handling_Ejb_Validation - Fatal编程技术网

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

在EJB中进行验证时,如何在jsf中显示多个错误消息?,jsf,error-handling,ejb,validation,Jsf,Error Handling,Ejb,Validation,根据问题的答案,我了解到,如果出现错误,EJB将抛出一个异常,该异常将在支持bean中捕获,并且支持bean将根据异常捕获向用户显示一条错误消息 我的问题是,如果有不止一个错误怎么办?当EJB一次只能抛出一个异常时,如何向用户显示多个错误消息 例如,在注册表中,用户需要输入电子邮件地址、姓名、密码和重新密码,并且不得为空。如果所有数据都有效,但给定的电子邮件地址已经存在,EJB将抛出EntityExistException,并通知用户电子邮件地址已经注册。如果有多个错误,如密码和重新密码不匹配,

根据问题的答案,我了解到,如果出现错误,EJB将抛出一个异常,该异常将在支持bean中捕获,并且支持bean将根据异常捕获向用户显示一条错误消息

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

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


注意:验证必须在EJB中进行,您不应该在支持bean操作方法中进行验证,而应该在普通的
验证器中进行验证

例如

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

}

谢谢你花时间回答这个问题。但是你的方法不是只适用于JSF吗?如果有一个web服务或web层被更改为struts,该怎么办?Struts也有自己的验证API。您也可以使用JSR303 bean验证(它是那些
@NotNull
@Size
等注释)。它被设计为独立于框架,并且已经无缝集成到JSF中。我不确定像Struts这样的古老框架是否也支持它。毕竟,EJB并不打算作为验证器。它们旨在调用事务性业务任务。如果验证同时需要两个属性,该怎么办?与登录一样,需要检查电子邮件地址和密码是否匹配?它也使用了验证器吗?只使用一个验证器。顺便说一句,如果电子邮件或密码有误,通知用户是一种糟糕的做法。只要说“登录”是错误的。否则,黑客很容易通过电子邮件进行暴力攻击。
@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"));
        }
    }

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

}