использование пользовательских типов в MyBatis/Spring

Я использую MyBatis с интеграцией Spring, как описано здесь.

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

Теперь задокументированный способ добиться этого — использовать 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 и не смог найти там свой обработчик....


person Sudarshan    schedule 11.01.2012    source источник


Ответы (1)


Я столкнулся с той же проблемой, также для Joda DateTime TypeHandler. Просматривая, я вижу, что обработчик зарегистрирован на самом деле. Однако TypeHandlerRegistry.getTypeHandler, похоже, использует null jdbcType для поиска обработчика.

Теперь последняя строка в приведенном выше фрагменте кода явно регистрирует обработчик для null JdbcType. К сожалению, кажется невозможным включить null в аннотацию @MappedJdbcTypes. Так что это похоже на ошибку для меня.

О, и вы можете просто удалить аннотацию @MappedJdbcTypes, чтобы она заработала.

ОБНОВИТЬ:

Вот как я настроил в своем 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> {...}
person usethe4ce    schedule 27.01.2012
comment
Вы предлагаете удалить аннотацию, помещенную в Typehandler, а также удалить код, который выполняет ручную регистрацию обработчика? и тогда, может быть, это могло бы работать? ... Я только что проверил этот сценарий, и он не работает - person Sudarshan; 27.01.2012
comment
Да, именно так я заставил это работать для себя, в последнем выпуске MyBatis, как для выбора, так и для обновлений. Таким образом, единственная аннотация - @MappedTypes(DateTime.class). - person usethe4ce; 27.01.2012
comment
Не подскажешь какая версия? а также если вы используете интеграцию spring с MyBatis? - person Sudarshan; 28.01.2012
comment
Да, MyBatis 3.0.6, MyBatis-Spring 1.0.2. - person usethe4ce; 29.01.2012
comment
Я использую те же версии, однако, когда я отлаживаю приложение, я вижу, что TYPE_HANDLER_MAP не имеет зарегистрированного DateTime.class... Вы сделали что-нибудь в своих весенних конфигурациях, которые позволяют эту регистрацию.. - person Sudarshan; 29.01.2012
comment
Спасибо, что упустили конфигурацию typeHandlersPackage, оглядываясь назад, это кажется довольно глупым .... - person Sudarshan; 31.01.2012