基于this问题的答案,我理解如果出现错误,EJB将抛出一个异常,它将在后备bean中捕获,而后备bean将根据异常向用户显示错误消息捉。
我的问题是,如果有多个错误怎么办?如何向用户显示多条错误消息,而EJB一次只能抛出一个异常?
例如,在注册表单中,用户需要输入电子邮件地址,名称,密码和重新密码,且不得为空。如果所有数据都有效但给定的电子邮件地址已经存在,EJB将抛出EntityExistException,并且将通知用户已经注册了电子邮件地址。如果密码和重新密码等多个错误不匹配且名称为空,该怎么办?我想向用户显示这两个错误。 EJB抛出什么异常?我可以采取什么方法来实现这一目标?
注意:验证必须在EJB
中答案 0 :(得分:2)
您不应该在支持bean操作方法中进行验证,而是在正常的Validator
中进行验证。
E.g。
<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 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"));
}
}
}