SE成長痛日記

アラサーSEが技術力を高めるために日々感じる痛みを綴るBlogです。

JSFのカスタムコンバータを作成する

今回は、PROCESS_VALIDATIONSフェーズで行っている、 コンバート処理とバリデーション処理に関する実装をしてみます。

コンバート処理

JSFではUIコンポーネントを生成後、 HTMLリクエスト パラメータ内の文字列をJavaのオブジェクトに変換して、 Beanの各プロパティに割り当てています。

ここではMailアドレスをストリングではなく MailAdressクラスに変換するように修正してみます。

まずごく簡単なアドレスクラスを作成します。

public class MailAddress {
    
    private String address;
    
    public MailAddress(String address){
        this.address = address;        
    }
    
    public String getMailAdress(){
        return this.address;
    }           
    
}

そして次のようにしてconverterクラスを作成します。

@FacesConverter(value = "mailAddressConverter")
public class MailAddressConverter implements Converter{

    @Override
    public Object getAsObject(FacesContext fc, UIComponent uic, String string) {
        System.out.println("mailAddressConverterによるコンバート処理:getAsObject");
        return new MailAddress((string));
    }

    @Override
    public String getAsString(FacesContext fc, UIComponent uic, Object o) {
        if(o != null && o instanceof MailAddress){
            System.out.println("mailAddressConverterによるコンバート処理:getAsString");
            return ((MailAddress)o).getMailAdress();
        } 
        return "";
    }    
}

コンバータを使うときは次のようにxhtmlに記述します。

<h:inputText value="#{responseBean.EMail}" p:placeholder="#{responseBean.defaultEMail}" converter="mailAddressConverter"></h:inputText>

あとは、管理Beanのアドレス部分をクラスを使用するように置き換えます。

ここで実行してみます。

表面上は、なんら変わりはありませんが、

f:id:hirohisoEx:20190308003045p:plain
ブラウザ上

コンソールを見ると、カスタムコンバータが動作していることがわかります。

00:30:20,061 INFO  [stdout] (default task-1) before:RESTORE_VIEW 1

00:30:20,068 INFO  [stdout] (default task-1) after:RESTORE_VIEW 1

00:30:20,068 INFO  [stdout] (default task-1) before:APPLY_REQUEST_VALUES 2

00:30:20,069 INFO  [stdout] (default task-1) after:APPLY_REQUEST_VALUES 2

00:30:20,069 INFO  [stdout] (default task-1) before:PROCESS_VALIDATIONS 3

00:30:20,070 INFO  [stdout] (default task-1) mailAddressConverterによるコンバート処理:getAsObject

00:30:20,071 INFO  [stdout] (default task-1) after:PROCESS_VALIDATIONS 3

00:30:20,071 INFO  [stdout] (default task-1) before:UPDATE_MODEL_VALUES 4

00:30:20,072 INFO  [stdout] (default task-1) after:UPDATE_MODEL_VALUES 4

00:30:20,072 INFO  [stdout] (default task-1) before:INVOKE_APPLICATION 5

00:30:20,072 INFO  [stdout] (default task-1) after:INVOKE_APPLICATION 5

00:30:20,072 INFO  [stdout] (default task-1) before:RENDER_RESPONSE 6

00:30:20,077 INFO  [stdout] (default task-1) mailAddressConverterによるコンバート処理:getAsString

00:30:20,079 INFO  [stdout] (default task-1) after:RENDER_RESPONSE 6

PROCESS_VALIDATIONSフェーズで文字列→オブジェクトの変換処理 RENDER_RESPONSE フェーズでオブジェクト→文字列の変換処理 がおこなわれているのがわかります。

本日は独自のコンバート処理を実装してみました。