Hatena::Grouparaistudy

czk-htnの日記

2009-06-03

[] IConverterを実装して独自の文字変換を行う(ResourceModel版) 06:45

教えていただいた方法で実装してみた。

wicket
item.add(new Label("bloodType") {
    private static final long serialVersionUID = 1L;
    @Override
    public IConverter getConverter(Class<?> type) {
        return new EnumerationConverter(BloodType.class);
    }
});
EnumerationConverter
package buzool.wicket;

import java.util.Locale;

import org.apache.wicket.model.ResourceModel;
import org.apache.wicket.util.convert.IConverter;
import org.apache.wicket.util.convert.converters.AbstractConverter;

public class EnumerationConverter extends AbstractConverter implements IConverter {
	private static final long serialVersionUID = 1L;
	
	private Class<? extends Enum<?>> clazz;

	public EnumerationConverter(Class<? extends Enum<?>> clazz) {
		this.clazz = clazz;
	}
	
	@Override
	public Object convertToObject(String value, Locale locale) {
		return null;
	}

	/**
	 * 
	 * Enumを文字列表現に変換する
	 * 
	 * clazz.getName() でFQCNをキーとし、アプリケーションプロパティファイルから引っ張る
	 * value.getClass.getName() だと $ が含まれてプロパティキーとしては扱いづらい
	 */
	@Override
	public String convertToString(Object value, Locale locale) {
		return new ResourceModel(clazz.getName() + "." + value).getObject();
	}

	@Override
	protected Class<?> getTargetType() {
		return clazz;
	}
}
BloodType.java

データクラスのフィールドとして定義するよりも、ファイルを切り出した方がFQCNに$が含まれなくてきれい。

public enum BloodType {
	A { public String toString() { return "A"; }},
	B { public String toString() { return "B"; }},
	O { public String toString() { return "O"; }},
	AB { public String toString() { return "AB"; }},
	Unknown { public String toString() { return "Unknown"; }};
};
Application.properties

最初 "表示するページ名.properties" というファイルに書いてあげても、キーがみつからないというエラーがでてしまい、なんでだろう??と小一時間悩んだ。アプリケーション(WebApplicationを継承したクラス)のプロパティファイルに書きましょう。

buzool.list.data.BloodType.A=A型
buzool.list.data.BloodType.B=B型
buzool.list.data.BloodType.O=O型
buzool.list.data.BloodType.AB=AB型
buzool.list.data.BloodType.Unkown=不明
トラックバック - http://araistudy.g.hatena.ne.jp/czk-htn/20090603