JSF 2.0 のコンバータ

JSF 1.2まではカスタムコンバータを作る場合、設定ファイルに書き込まないといけないので面倒だった。

JSF2からはそれもアノテーションで可能になった。もちろん環境設定ファイルで一元管理することも可能なため、どちらを利用するかは選択すればよい。

たとえば入力した星の数を数えてIntegerにコンバートする場合はこんな感じ(わかりやすくするためにcontextがnullだったらthrowとかはいれてない。実際のところnullの引数がきたことはないけど)。

package converter;

import javax.faces.component.UIComponent;
import javax.faces.context.FacesContext;
import javax.faces.convert.Converter;
import javax.faces.convert.FacesConverter;

@FacesConverter(value="length" ,forClass=Integer.class)
public class LengthConverter implements Converter{

    public Object getAsObject(FacesContext context, UIComponent component, String value) {
        return value.replaceAll("[^★]", "").length();
    }

    public String getAsString(FacesContext context, UIComponent component, Object value) {
        int len = (Integer)value;

        StringBuilder result = new StringBuilder();
        for(int i=0;i<len ;i++){
            result.append('★');
        }


        return result.toString();
    }

}


利用する場合は以下のようになる。

<input jsfc="h:inputText" type="text" value="#{hoge.star}"
    converterMessage="★で入力してください" >
        <f:converter converterId="length" />
</input>

バリデータも同様。