根据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/