SpringMVCでFreemarkerを使ってる時にEnumをviewで使いたい | Pimp my Code. @wataru420

Pimp my Code. @wataru420

My name is Wataru Fukunaga.

Freemarkerのテンプレートの中でEnum使ってゴニョゴニョしたい時ってありますよね?
でも普通にはEnumを呼び出すことができないわけです。
そんで一番簡単なのが

BeansWrapper.getDefaultInstance().getEnumModels()

これをテンプレートに渡して上げる方法。
まずはコントローラー

@RequestMapping(value = "/hoge", method = RequestMethod.GET)
public String hoge(Locale locale, Model model) {
model.addAttribute("enums", BeansWrapper.getDefaultInstance().getEnumModels() );
return "hoge";
}

それからテンプレートに下記のように書けばいけます。

${enums["com.example.MinisiteFieldType"].SEOTEXT}

でも、これだと毎回コントローラーに書かないと行けないので面倒。

そこでFreeMarkerViewクラスを拡張します。

CustomFreeMarkerViewクラスを作って、下記を記述。

public class CustomFreeMarkerView extends FreeMarkerView {

@Override
protected void exposeHelpers(Map<String, Object> model, HttpServletRequest request) throws Exception {
super.exposeHelpers(model, request);
model.put("enums", BeansWrapper.getDefaultInstance().getEnumModels());
}

}


FreeMarkerViewResolverクラスを拡張して、実際に使えるようにします。

CustomFreeMarkerViewResolverクラスを作って、下記を記述。

public class CustomFreeMarkerViewResolver extends FreeMarkerViewResolver {

public CustomFreeMarkerViewResolver() {
setViewClass(requiredViewClass());
}

@SuppressWarnings("rawtypes")
@Override
protected Class requiredViewClass() {
return CustomFreeMarkerView.class;
}

}

あとはspringの設定ファイルにCustomFreeMarkerViewResolverをFreeMarkerViewResolverの代わりに使用するよう指定してやります。

これで毎回コントローラーに記述しなくても同じように使えます。
以上

Clean Code アジャイルソフトウェア達人の技Clean Code アジャイルソフトウェア達人の技
Robert C. Martin 花井 志生

アスキー・メディアワークス 2009-05-28
売り上げランキング : 198273

Amazonで詳しく見る