1

正常に機能する登録フォームを作成したいと思います。

<h:form id="register_form">
            <h:panelGrid columns="3">
                <h:outputLabel for="email" value="E-mail:" />
                <h:inputText id="email" value="#{userc.userb.user.email}">
                    <f:ajax event="blur" render="m_email" />
                </h:inputText>
                <h:message id="m_email" for="email" ajaxRendered="false" />

                <h:outputLabel for="password" value="Passoword" />
                <h:inputSecret id="password" value="#{userc.userb.user.password}">
                    <f:validator validatorId="confirmPasswordValidator" />
                    <f:attribute name="confirm" value="#{confirmPassword.submittedValue}" />
                </h:inputSecret>
                <h:message id="m_password" for="password" />

                <h:commandButton value="Registerr" action="#{userc.register}">
                    <f:ajax execute="@form" render="@form" />
                </h:commandButton>
                
                <h:messages globalOnly="true" layout="table" />
                
            </h:panelGrid>
        </h:form>

そしてこれは私のコントローラーです:

public void register(){
    FacesMessage message;
    try {
        userb.encryptPassword();
        userEAO.create(userb.getUser());
        
        message = new FacesMessage("Register successfully!");
        FacesContext.getCurrentInstance().addMessage(null, message);
    } catch (Exception e) {
        // 1062 : duplicate entry
        if (e.getMessage().contains("Duplicate")){
            message = new FacesMessage("User already registered, please try another email");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }else{
            message = new FacesMessage("An error occured, try again please");
            FacesContext.getCurrentInstance().addMessage(null, message);
        }
    }
    
}

したがって、たとえば、一部のユーザーが自分自身を2回登録しようとすると、重複しているというメッセージが返されますが、これが最善の方法かどうか疑問に思います。

これらの種類の例外をどのように処理しますか?

4

1 に答える 1

1

これらの検証は、ビジネスロジックレイヤーオブジェクトによって処理される必要があります。この場合、それはuserEAOオブジェクトのように見えます。このエラーメッセージを例外(IMHOは使用しません)のフレーバーで処理する必要があるかどうかを決定できます。

私の場合、Message基本的に整数コードと操作の結果を保持するメッセージを含むクラスを使用することを好みます。私の場合、通常は操作が成功したことを示すために0以上を返し、エラーを宣言するために負のコードを使用します。これはかなり基本的な例です。

public class Message {
    private int code;
    private String message;
    //constructor...
    //getters and setters...
}

public class UserBL {

    public Message create(User user) {
        //do some fancy validations
        if (!verifyDuplicatedUser(user)) {
            return new Message(-1000, "Duplicated user");
        }
        //and the operations...
        saveUser(user);
        return new Message(0, "Register successfully!");
    }

}

これで、コントローラーは実際に実行する必要のある処理に進みます(つまり、重いビジネスロジックの検証は行われません)。

public void register() {
    FacesMessage fmessage;
    userb.encryptPassword();
    Message message = userEAO.create(userb.getUser());
    fmessage = new FacesMessage(message.getMessage());
    FacesContext.getCurrentInstance().addMessage(null, fmessage);
}

このアプローチは、Excelシートの結果の検証など、一連のデータを検証する必要があり、エラーのリストを表示する必要がある場合にも役立ちます(1つのエラーを何度も表示するのは非常に煩わしいためです)。

システムのメッセージを含むテーブルからメッセージを取得したり、プロパティファイルを使用して国際化を処理したりするなど、メッセージの作成方法を改善できます(もちろん、機能要件によって異なります)。

于 2012-09-19T17:04:12.433 に答える