Как отладить MyBatis NoSuchMethodException в kotlin? - PullRequest
0 голосов
/ 19 марта 2020

У меня есть простой класс, подобный этому:

data class Foo(
        val id: Long,
        val created: LocalDateTime,
        val myBool: Boolean? = null,
        val comment: SensitiveString? = null
)

Я получаю исключение:

org.mybatis.spring.MyBatisSystemException: nested exception is org.apache.ibatis.reflection.ReflectionException: Error instantiating class com.XXX.XXX.XXX.XXX.Foo with invalid types (long,LocalDateTime,boolean,SensitiveString) or values (XX,2020-03-19T17:36:30.415,false,0@SensitiveString). 
Cause: java.lang.NoSuchMethodException: com.XXX.XXX.XXX.XXX.Foo.<init>(long, java.time.LocalDateTime, boolean, com.XXX.XXX.XXX.XXX.SensitiveString)

Вот мой xml результатКарта:

<resultMap id="fooMap" type="com.XXX.XXX.XXX.XXX.Foo">
        <constructor>
            <arg column="id" javaType="_long"/>
            <arg column="created" javaType="java.time.LocalDateTime"
                 typeHandler="com.XXX.XXX.XXX.XXX.LocalDateTimeTypeHandler"/>
            <arg column="myBool" javaType="_Boolean"/>
            <arg column="comment" javaType="com.XXX.XXX.XXX.XXX.SensitiveString"
                typeHandler="com.XXX.XXX.XXX.XXX.EncryptedStringTypeHandler"/>
        </constructor>
    </resultMap>

Как я могу решить это? запрашиваемый конструктор обязательно должен быть доступен, так что это очень запутанно. Более того: когда я пытаюсь создать свой собственный конструктор со всеми полями, kotlin жалуется, говоря, что конструктор конфликтует с неявным.

Как я могу справиться с этим?

1 Ответ

1 голос
/ 19 марта 2020

У меня была именно эта проблема. Для меня проблема заключалась в типе Boolean? - тип Java равен java.lang.Boolean, если тип обнуляемый. Я сделал это с аннотациями, чтобы это выглядело так:

    @ConstructorArgs (
        ...
        Arg(column = "myBool", javaType = java.lang.Boolean::class)
        ...
    )
...