在EJB中进行验证时,如何在jsf中显示多个错误消息?
根据问题的答案,我了解到,如果出现错误,EJB将抛出一个异常,该异常将在支持bean中捕获,并且支持bean将根据异常捕获向用户显示一条错误消息 我的问题是,如果有不止一个错误怎么办?当EJB一次只能抛出一个异常时,如何向用户显示多个错误消息 例如,在注册表中,用户需要输入电子邮件地址、姓名、密码和重新密码,并且不得为空。如果所有数据都有效,但给定的电子邮件地址已经存在,EJB将抛出EntityExistException,并通知用户电子邮件地址已经注册。如果有多个错误,如密码和重新密码不匹配,并且名称为空,该怎么办?我想向用户展示这两个错误。EJB应该抛出什么异常?我可以采取什么方法来实现这一点在EJB中进行验证时,如何在jsf中显示多个错误消息?,jsf,error-handling,ejb,validation,Jsf,Error Handling,Ejb,Validation,根据问题的答案,我了解到,如果出现错误,EJB将抛出一个异常,该异常将在支持bean中捕获,并且支持bean将根据异常捕获向用户显示一条错误消息 我的问题是,如果有不止一个错误怎么办?当EJB一次只能抛出一个异常时,如何向用户显示多个错误消息 例如,在注册表中,用户需要输入电子邮件地址、姓名、密码和重新密码,并且不得为空。如果所有数据都有效,但给定的电子邮件地址已经存在,EJB将抛出EntityExistException,并通知用户电子邮件地址已经注册。如果有多个错误,如密码和重新密码不匹配,
注意:验证必须在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"));
}
}
}