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のアドレス部分をクラスを使用するように置き換えます。
ここで実行してみます。
表面上は、なんら変わりはありませんが、
コンソールを見ると、カスタムコンバータが動作していることがわかります。
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 フェーズでオブジェクト→文字列の変換処理 がおこなわれているのがわかります。
本日は独自のコンバート処理を実装してみました。