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à ....

Était-ce utile?

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> {...}
Licencié sous: CC-BY-SA avec attribution
Non affilié à StackOverflow
scroll top