スーパークラスのフィールドに記述した Converter が反映されない件
Teeda を使って開発しているとき、共通のフィールドなんかを抽象クラスとしてまとめて書いたりして、この抽象クラスを継承して個々の Page クラスを作ったりするわけですが、前々からフィールドに書いた Converter が適用されないなって思っていたんですよ。
public abstract class AbstractPage { @DateTimeConverter(pattern = "yyyy/MM/dd HH:mm:ss") public Date date; } public class HogePage extends AbstractPage { }
この状態で、hoge.html へアクセスしても、date の値を表示したときはデフォルトの「yyyy/MM/dd」形式でしか表示されないわけです。
下記のように getter を用意して、こいつに対して Converter をかけると期待した表示になったりします。
public class HogePage extends AbstractPage { @DateTimeConverter(pattern = "yyyy/MM/dd HH:mm:ss") public Date getDate() { return this.date; } }
しかし、このためだけにわざわざ getter を用意するのは冗長だし、やっぱりフィールドに Converter をかけるだけでうまく動かしたい!ということで、Teeda の下記クラスをちょこっといじってみました。
package org.seasar.teeda.extension.annotation.handler; // import文省略 public class ConstantConverterAnnotationHandler extends AbstractConverterAnnotationHandler { protected void processFields(S2Container container, Class componentClass, String componentName, NamingConvention namingConvention, BeanDesc beanDesc) { Field[] fields = componentClass.getDeclaredFields(); for (int i = 0; i < fields.length; ++i) { processField(container, componentClass, componentName, namingConvention, beanDesc, fields[i]); } // ここから追加 for (Class clazz = componentClass; (clazz = clazz.getSuperclass()) != null;) { fields = clazz.getDeclaredFields(); for (int i = 0; i < fields.length; ++i) { processField(container, componentClass, componentName, namingConvention, beanDesc, fields[i]); } } // ここまで追加 } // 以下省略 }
こんな感じに改変して動かしてみると、スーパークラスにかけた Converter もばっちり識別してくれました!って話。
これを取り入れてくれたりとか・・・はしてくれないですかね?