Я использую 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
)