en utilisant des types personnalisés dans mybatis / Spring
Question
J'utilise mybatis avec Spring Integration comme décrit .
J'utilise encore la date Joda API au lieu de l'API Java Date, maintenant le plus délicat est veiller à ce que mybatis reconnaît l'API Date Joda, et me permet d'interroger le même.
Maintenant, la manière documentée d'y parvenir est d'utiliser un DateTypeHandler
Je suppose que si nous utilisons les annotations correctes, mybatis ramassera le gestionnaire personnalisé et l'enregistrer avec le sqlsessionfactory.
Alors mes regards de classe comme
@MappedTypes(value = DateTime.class)
@MappedJdbcTypes(value = {JdbcType.DATE,JdbcType.TIME,JdbcType.TIMESTAMP})
public class MyBatisJodaDateTimeType extends DateTypeHandler {
......
.....
}
Certains comment cela n'enregistre pas mon gestionnaire de type personnalisé .... Ce que j'ai à faire, est le code d'écriture comme celui-ci au démarrage application ...
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);
Je sais que cela ressemble à la merde et je veux éviter, je ne peux pas get mybatis à analyser ma demande de ces annotations et enregistrer mon gestionnaire de type personnalisé automatiquement?
Je suis sûr que mon type n'a pas été enregistré (en utilisant uniquement les annotations) parce que j'ai fait une inspectent, dans la code mybatis et ne pouvait pas trouver mon gestionnaire là ....
La solution
je suis tombé sur le même problème, aussi pour un Joda DateTime TypeHandler. Traçage à travers, je vois que le gestionnaire est effectivement enregistré. Cependant, TypeHandlerRegistry.getTypeHandler
semble utiliser un jdbcType de null
pour rechercher le gestionnaire.
Maintenant, la dernière ligne dans votre code extrait ci-dessus enregistre explicitement un gestionnaire pour null
JdbcType. Malheureusement, il semble impossible d'inclure null
dans l'annotation @MappedJdbcTypes
. Alors, qui ressemble à un bug pour moi.
Oh, et vous pouvez être en mesure de supprimer simplement l'annotation @MappedJdbcTypes
tout à fait, pour le faire fonctionner.
Mise à jour:
Voici comment je mis dans mon 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>
Si vous prenez des gestionnaires de type en balayant un paquet comme celui-ci, vous pouvez définir le niveau d'enregistrement mybatis à debug pour voir ceux qui il tente d'ajouter.
Mon TypeHandler commence comme ceci:
@MappedTypes(DateTime.class)
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...}