Spring-data 2.1 получает "UnsupportedOperationException: нет средства доступа для установки свойства" с kotlin - PullRequest
0 голосов
/ 20 января 2019

Окружающая среда: Spring-boot 2.1.2.RELEASE, Spring-данные 2.1.4. РЕЛИЗ, Котлин 1.2.х ~ 1.3.х, MongoDB.

Я определил класс модели как:

@Document
class MeAccount : Setting() {

    lateinit var id: String

    val accountEntries = listOf<BankAccount>()
 }

Когда я пытался прочитать эту модель из mongodb, я получил исключение трассировки стека:

java.lang.UnsupportedOperationException: No accessor to set property private final java.util.List com.xxx.MeCustodianAccount.accountEntries!
    at com.xxx.MeCustodianAccount_Accessor_fs514j.setProperty(Unknown Source)
    at org.springframework.data.mapping.model.ConvertingPropertyAccessor.setProperty(ConvertingPropertyAccessor.java:61)
    at org.springframework.data.mongodb.core.convert.MappingMongoConverter.readProperties(MappingMongoConverter.java:378)

Внимание, код отлично работает с spring-boot 1.5.x и spring-data 1.x.

Что я могу сделать, чтобы решить эту проблему? Похоже, много похожих отчетов об исключениях ниже:

Изменение безопасности весенней загрузки 2.1.0 с использованием класса данных kotlin?

https://github.com/arangodb/spring-data/issues/123

https://github.com/spring-projects/spring-boot/issues/15698

[Решено] Работает после возврата к Spring-boot 2.0.x и spring-data-commons 2.0.x. Сохранит 2.1 исключенным в будущих планах обновления.

1 Ответ

0 голосов
/ 05 июня 2019

Spring Data в 2.1.изменил способ работы с конечными полями в сущностях.Он больше не использует отражение, чтобы переопределить неизменность полей, что в целом хорошо.Есть несколько способов справиться с проблемой.

Они описаны здесь: https://jira.spring.io/browse/DATACMNS-1374?focusedCommentId=182289&page=com.atlassian.jira.plugin.system.issuetabpanels%3Acomment-tabpanel#comment-182289

Вот что рекомендуют ребята из Spring:

  1. Добавьте @PersistenceConstructor для создания сущности, которая устанавливает неизменныйfields.
  2. Добавьте методы засухи (MyEntity withXxx (…)), чтобы создать новый экземпляр, содержащий измененное значение свойства.
  3. В качестве альтернативы: используйте функцию класса данных Kotlin.Это в основном будет делать то же самое, что и методы с вихрем.

Так что для вас должно работать что-то вроде этого:

@Document
data class MeAccount(val id: String, val accountEntries: List<Price>) : Setting()
...