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

StackOverflow https://stackoverflow.com/questions/8815983

  •  27-10-2019
  •  | 
  •  

Вопрос

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

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

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

Это было полезно?

Решение

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

Мой тип -ручный начинается так:

@MappedTypes(DateTime.class)
public class DateTimeTypeHandler implements TypeHandler<DateTime> {...}
Лицензировано под: CC-BY-SA с атрибуция
Не связан с StackOverflow
scroll top