Kotlin + ModelMapper: DefaultConstructorMarker - PullRequest
0 голосов

Я использую ModelMapper для отображения сущностей <-> DTO в Java.Часть функционала выглядит здесь:

mapper.createTypeMap(Continent.class, ContinentDto.class)
                .addMappings(m -> m.skip(ContinentDto::setPlanet)).setPostConverter(toDtoConverter());

Мне интересно в этой части кода m -> m.skip(ContinentDto::setPlanet), где мы определяем мапперу, что нам не нужно устанавливать планету поля при преобразовании DTO в сущность и обратно.Расширенный код выглядит следующим образом:

.addMappings(m -> m.skip(new DestinationSetter<ContinentDto, Object>() {
    @Override
    public void accept(ContinentDto destination, Object value) {
        destination.setPlanet((Long) value);
    }
})).setPostConverter(toDtoConverter());

Я новичок в Kotlin, и я набрал это:

.addMappings { it.skip { destination, value: Long -> destination.user = value } }
.postConverter = toDtoConverter()

Компилятор вылетает с ошибкой.

Caused by: org.modelmapper.internal.ErrorsException: null
    at org.modelmapper.internal.Errors.toException(Errors.java:254) ~[modelmapper-2.3.4.jar:na]
    at org.modelmapper.internal.ProxyFactory.proxyFor(ProxyFactory.java:86) ~[modelmapper-2.3.4.jar:na]
    at org.modelmapper.internal.ProxyFactory.proxyFor(ProxyFactory.java:72) ~[modelmapper-2.3.4.jar:na]
    at org.modelmapper.internal.ReferenceMapExpressionImpl.skip(ReferenceMapExpressionImpl.java:84) ~[modelmapper-2.3.4.jar:na]
    at org.modelmapper.internal.ConfigurableMapExpressionImpl.skip(ConfigurableMapExpressionImpl.java:73) ~[modelmapper-2.3.4.jar:na]
    at ru.xpendence.slimer.mapper.impl.UserParamsMapper$init$1.configure(UserParamsMapper.kt:29) ~[classes/:na

Я пометил ErrorsException точкой останова и перехватил текст исключения:

Cannot map final type ru.xpendence.slimer.dto.UserParamsDto.

Я нашел точку, из которой вылетает исключение:

if (Modifier.isFinal(type.getModifiers()))
      throw errors.invocationAgainstFinalClass(type).toException();

Чем я делаю классы как открытые, и перехватил это:

java.lang.IllegalStateException: невидимый тип параметра kotlin.jvm.internal.DefaultConstructorMarker arg6 для общедоступного ru.xdency.slimer.dto.UserParamsDto $ ByteBuddy $ 5aqRCzYE (java.lang.Long, java.lang.Long.lang.Integer, java.lang.Double, java.lang.String, java.time.LocalDateTime, int, kotlin.jvm.internal.DefaultConstructorMarker)

Как я понимаю, компилятор обнаружил DefaultConstructorMarker &не может определить его тип.Что делать?

На всякий случай, класс UserParamsDto:

open class UserParamsDto(

        var user: Long? = null,
        var height: Int? = null,
        var weight: Double? = null,
        var gender: String? = null,
        var birthDate: LocalDateTime? = null

) : AbstractDto()

open class AbstractDto(

        var id: Long? = null,
        var created: LocalDateTime? = null,
        var updated: LocalDateTime? = null
)
...