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>
バリデータも同様。