MyBatis Spring Boot - обработчик нестандартного типа - PullRequest
0 голосов
/ 08 ноября 2018

Мне нужна помощь с интеграцией Spring Boot и MyBatis. У меня есть проблема с пользовательским BaseTypeHandler. Я создал картограф:

@MappedTypes({LocalDateTime.class})
public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {

Я добавил обработчик типа:

sqlSessionFactory.setTypeHandlers(new LocalDateTimeHandler[]{new LocalDateTimeHandler()});

И у меня следующая ошибка:

org.apache.ibatis.executor.ExecutorException: No constructor found in com.some.space.SomeObject matching [java.lang.Integer, java.sql.Timestamp, java.sql.Timestamp]

Где SomeObject выглядит так:

public class SomeObject {
    private Long id;
    private LocalDateTime created;
    private LocalDateTime updated;

    public SomeObject(Integer id, LocalDateTime created, LocalDateTime updated){
    //..........
    }
}

Я использую mybatis-spring и spring-boot-starter-web version 1.3.2.

Все примеры работы с TypeHandlers относятся к конфигурации XML, но мне нужно использовать конфигурацию Java способом. Что я делаю не так?


UPD:

Мой картограф:

@Component
@Mapper
public interface SomeObjectRepository {

    @Select("SELECT * FROM some_objects")
    @Results(value = {
            @Result(property = "created", column = "created_date", typeHandler = LocalDateTimeTypeHandler.class, jdbcType = JdbcType.TIMESTAMP),
            @Result(property = "updated", column = "updated_date", typeHandler = LocalDateTimeTypeHandler.class, jdbcType = JdbcType.TIMESTAMP)
    })
    List<SomeObject> getAll();
}

1 Ответ

0 голосов
/ 08 ноября 2018

Вы не указали mybatis использовать ваш обработчик типов для полей меток времени. Таким образом, он преобразует поля меток времени из базы данных, используя обработчик типа по умолчанию для этого типа JDBC.

Если вы хотите сделать это только в некоторых запросах, сделайте так для отображения xml:

<result property="created" column="created"
    typeHandler="com.mycompany.myapp.LocalDateTimeHandler"/>

Или с помощью аннотаций:

@Result(property = "created", column = "created",
        typeHandler=LocalDateTimeHandler.class)

Если вы хотите сделать его глобальным и использовать его для всех полей определенного типа JDBC, добавьте @MappedJdbcTypes к вам TypeHandler:

@MappedJdbcTypes({JdbcType.TIMESTAMP})
@MappedTypes({LocalDateTime.class})
public class LocalDateTimeHandler extends BaseTypeHandler<LocalDateTime> {

В зависимости от версии mybatis, которую вы используете, вам может потребоваться установить includeNullJdbcType=true для аннотации @MappedJdbcTypes.

Подробнее об этом см. документацию .

...