2012-01-11 2 views
4

Я использую MyBatis с интеграцией с пружиной, как описано here.с использованием пользовательских типов в MyBatis/Spring

Я использую API-интерфейс Joda Date вместо API дат Java, теперь сложный бит гарантирует, что MyBatis распознает API дат Joda и позволяет мне запрашивать то же самое.

Теперь документированный способ достижения этой цели является использование DateTypeHandler

Я предполагаю, что если мы будем использовать правильные аннотации, Mybatis подберут пользовательский обработчик и зарегистрировать его с sqlsessionfactory.

Так что мой класс выглядит

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

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

Некоторые, как это не регистрирует свой обработчик пользовательского типа ...., Что я имею сделать, это написать код, как это при запуске приложения ...

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 отсканировать мое приложение для этих аннотаций, а затем автоматически зарегистрировать обработчик пользовательского типа?

Я уверен, что мой тип не был зарегистрирован (используя только аннотации), потому что я сделал инспектировать в коде 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

Можете ли вы сказать мне, какая версия? а также если вы используете интеграцию Spring с MyBatis? – Sudarshan

Смежные вопросы