ラベル MyBatis の投稿を表示しています。 すべての投稿を表示
ラベル MyBatis の投稿を表示しています。 すべての投稿を表示

2012年2月6日月曜日

MyBatisの検索結果としてインターフェイスのリストを返す

Guiceをシステムに採用して半年がたち、すっかりインターフェイスが体に馴染みました。
こうなってくると永続化層のMyBatisにもインターフェイスを返して欲しくなります。
しかし、MyBatisは初期状態ではデフォルトコンストラクタがないクラスには対応していません。

ObjectFactoryの実装とバインド
この問題を解決するには、ObjectFactoryを実装し、MyBatisModule#bindObjectFactoryTypeメソッドでバインドします。
ObjectFactoryへProviderを注入
せっかくGuiceを採用しているのですから、ObjectFactoryへProviderを注入し、オブジェクトの生成を委譲しましょう。
実装したものが次のクラスです。

package myamamoto.sample.mapper;
import myamamoto.sample.bean.Person;
import org.apache.ibatis.reflection.factory.DefaultObjectFactory;
import com.google.inject.Inject;
import com.google.inject.Provider;
class BeanObjectFactory extends DefaultObjectFactory {
private static final long serialVersionUID = 1L;
private Provider<Person> personProvider;
@Inject
BeanObjectFactory(Provider<Person> personProvider) {
this.personProvider = personProvider;
}
@Override
public Object create(@SuppressWarnings("rawtypes") Class type) {
if(Person.class == type){
return this.personProvider.get();
}
return super.create(type);
}
}