2012-01-11 26 views
4

私は、hereのように、Spring IntegrationでMyBatisを使用しています。MyBatis/Springでカスタムタイプを使用する

さらに、Java Date APIの代わりにJoda Date APIを使用しています。これで、MyBatisがJoda Date APIを認識して、MyBatisがそれを照会できるようになります。

今、これを達成するための文書化の方法は、私たちが正しいのアノテーションを使用する場合、MyBatisのは、カスタムハンドラをピックアップしsqlsessionfactoryに登録することを想定していますDateTypeHandler

を使用することです。だから私のクラスがいくつかこれは私が何を持っていますどのような、....私のカスタム・タイプのハンドラを登録しませんか、アプリケーションの起動時にこのようなコードを書いている

@MappedTypes(value = DateTime.class) 
@MappedJdbcTypes(value = {JdbcType.DATE,JdbcType.TIME,JdbcType.TIMESTAMP}) 

public class MyBatisJodaDateTimeType extends DateTypeHandler { 
...... 
..... 
} 

のように見えます

...

私はMyBatisのは、これらのアノテーションのための私のアプリケーションをスキャンし、自動的に私のカスタム型ハンドラを登録するために取得カント、
SqlSessionFactory mybatisSessionFactory = applicationContext.getBean("sqlSessionFactory", SqlSessionFactory.class); 
     MyBatisJodaDateTimeType myBatisJodaDateTimeType = applicationContext.getBean("myBatisJodaDateTimeType", MyBatisJodaDateTimeType.class); 

     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.DATE, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.TIME, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, JdbcType.TIMESTAMP, myBatisJodaDateTimeType); 
     mybatisSessionFactory.getConfiguration().getTypeHandlerRegistry().register(DateTime.class, null, myBatisJodaDateTimeType); 

は、私はそれはがらくたのように見える知っていると私はそれを避けるためにしたいですか?私は同じ問題に遭遇した

私はMyBatisのコードで検査しなかったし、そこに私のハンドラを見つけることができなかったので、私のタイプは、(単に注釈を使用して)登録されていないことを確信しています....

答えて

4

また、Joda DateTime TypeHandlerの場合も同様です。トレースすると、ハンドラが実際に登録されていることがわかります。しかし、TypeHandlerRegistry.getTypeHandlerは、null jdbcTypeを使用してハンドラを検索しているようです。

上記コードスニペットの最後の行には、null JdbcTypeのハンドラが明示的に登録されています。残念ながら、null@MappedJdbcTypes注釈に含めることは不可能です。それは私のバグのように見える。

ああ、実際には、@MappedJdbcTypesアノテーションをすべて削除して機能させることができます。

UPDATE:ここ

が、私は私のapplicationContext.xmlをで設定方法は次のとおりです。

<bean id="sqlSessionFactory" class="org.mybatis.spring.SqlSessionFactoryBean"> 
    <property name="dataSource" ref="dataSource" /> 
    <property name="mapperLocations" value="classpath*:META-INF/persistence/*.xml" /> 
    <property name="typeAliasesPackage" value="com.mycompany.data" /> 
    <property name="typeHandlersPackage" value="com.mycompany.typehandler" /> 
</bean> 
<bean class="org.mybatis.spring.mapper.MapperScannerConfigurer"> 
    <property name="basePackage" value="com.mycompany.persistence" /> 
</bean> 

あなたは、このようなパッケージをスキャンすることによってタイプ・ハンドラを拾う場合は、デバッグにMyBatisのログレベルを設定することができますそれが追加しようとするものを見る。

マイTypeHandlerは次のように開始します。

@MappedTypes(DateTime.class) 
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...} 
+0

あなたは私たちがTypehandlerの上に置かれた注釈を削除しても、ハンドラの手動登録を行うコードを削除することができることを示唆していますか?多分それは働くことができますか? ...私はそのシナリオをテストしただけで失敗します。 – Sudarshan

+0

はい、MyBatisの最新のリリースでは、選択と更新の両方で自分自身のために働いています。だから、@MappedTypes(DateTime.class)だけの注釈です。 – usethe4ce

+0

あなたはどのバージョンを教えていただけますか?また、MyBatisとのバネ統合を使用している場合は、 – Sudarshan

関連する問題