Domanda

Sto usando MyBatis con l'integrazione di primavera come descritto qui .

Sto ulteriormente utilizzando la data Joda API al posto del Data API Java, ora il po 'complicato è assicurarsi che MyBatis riconosce la Data di Joda API, e mi permette di interrogare lo stesso.

Ora il modo documentato per raggiungere questo obiettivo è quello di utilizzare un DateTypeHandler

Io parto dal presupposto che se usiamo le annotazioni corrette, Mybatis prenderà la gestore personalizzato e registrarlo con lo sqlsessionfactory.

Quindi, il mio aspetto di classe come

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

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

Alcuni come questo non registra mio gestore Personalizzata tipo ...., Quello che sto avendo a che fare, è scrivere il codice come questo a un'applicazione di avvio ...

 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);

Lo so che sembra merda e voglio evitarlo, i cant get MyBatis per eseguire la scansione la mia domanda di queste annotazioni e poi registrare il mio tipo personalizzato gestore automaticamente?

sono sicuro che il mio tipo, non è stato registrato (Usando solo le annotazioni), perché ho fatto una ispezionare il codice MYBatis e non riuscivo a trovare il mio gestore di lì ....

È stato utile?

Soluzione

mi sono imbattuto nello stesso problema, anche per un Joda DateTime TypeHandler. Tracciare attraverso, vedo che il gestore è effettivamente registrato. Tuttavia, TypeHandlerRegistry.getTypeHandler sembra utilizzare un jdbcType null per cercare il gestore.

Ora, l'ultima riga nel frammento di codice sopra registra in modo esplicito un gestore per null JdbcType. Purtroppo, sembra essere impossibile includere nel null l'annotazione @MappedJdbcTypes. In modo che appare come un bug per me.

Oh, e si può essere in grado di rimuovere solo l'annotazione @MappedJdbcTypes del tutto, per farlo funzionare.

UPDATE:

Ecco come ho creato nella mia 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>

Se si prende in mano tipo gestori mediante la scansione di un pacchetto come questo, è possibile impostare le MyBatis livello di registrazione di debug per vedere quali si tenta di aggiungere.

Il mio TypeHandler inizia così:

@MappedTypes(DateTime.class)
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...}
Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top