0

この質問の回答に基づいて、エラーが発生した場合、EJBはバッキングBeanでキャッチされる例外をスローし、バッキングBeanはそのキャッチの例外に基づいてエラーメッセージをユーザーに表示することを理解しています。

私の質問は、複数のエラーがある場合はどうなるかということです。EJBが一度に1つの例外しかスローできないのに、ユーザーに複数のエラーメッセージを表示するにはどうすればよいですか?

たとえば、登録フォームでユーザーは電子メールアドレス、名前、パスワード、および再パスワードを入力する必要があり、nullであってはなりません。すべてのデータが有効であるが、指定された電子メールアドレスがすでに存在する場合、EJBはEntityExistExceptionをスローし、電子メールアドレスがすでに登録されていることをユーザーに通知します。パスワードと再パスワードが一致せず、名前が空であるなどの複数のエラーがある場合はどうなりますか?そして、これら2つのエラーをユーザーに表示したいと思います。EJBはどのような例外をスローする必要がありますか?これを達成するためにどのようなアプローチを取ることができますか?

注:検証はEJBで行う必要があります

4

1 に答える 1

2

バッキング 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 はここで例外をスローしないことに注意してください。これは、DB のダウンや間違ったテーブル/列の定義など、致命的で回復不能なエラーが発生した場合にのみ行う必要があります。

そして、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"));
        }
    }

}
于 2012-06-01T18:45:25.777 に答える