Проблема при десериализации сериализованного объекта

  • У меня есть класс данных kotlin, имеющий параметризованный конструктор и метод, который выводит свой результат на основе свойства.
  • Я аннотировал этот метод с помощью @JsonProperty, чтобы его производный вывод также можно было сериализовать для вывода JSON, поскольку это было для меня требованием.
  • Теперь проблема возникает, когда я пытаюсь десериализовать этот JSON, и он не находит поля для производногоProp

Cannot construct instance of MyDataClass, problem: Should never call set() on setterless property ('derivedProp')

@JsonIgnoreProperties(ignoreUnknown = false)
data class MyDataClass(
   val boolProp: Boolean = true,
   val dataProp: DataProp = DataProp(),
   val mainProp: String? = null
) : Serializable {

   @JsonProperty
   @Suppress("unused")
   fun derivedProp(): List =
      someLogicOnMainProp(mainProp)

}
val определяет неизменяемые переменные, поэтому для val нет установщика. Использование var вместо val решит проблему.
user10386912 17.12.2018 11:15

проблема не в трех свойствах, объявленных как val, а в четвертом, который создается во время сериализации из-за метода производногоProp ()

Vivek Gupta 17.12.2018 11:16

не могли бы вы объяснить, как?

Vivek Gupta 17.12.2018 12:35
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
4
751
2
Перейти к ответу Данный вопрос помечен как решенный

Ответы 2

Если вы используете свойство вместо функции, вы все равно можете определить сеттер и просто игнорировать его при его вызове. Не самое красивое решение, но должно помочь:

@get:JsonProperty
var derivedProp: List<Any>
    get() = someLogicOnMainProp(mainProp)
    set(value) { /* do nothing */ }

Это может быть обходным путем, но это будет стоить избыточности данных во время выполнения, ища лучшее решение :-)

Vivek Gupta 17.12.2018 12:41

Я не совсем понимаю, как это будет лишним? Вместо функции у вас теперь просто свойство.

Patric 17.12.2018 12:44

потому что данные будут избыточными (mainProp и производноеProp)

Vivek Gupta 17.12.2018 12:47

Нет, не будет, потому что производнаяProp - это просто функция, которую вы вызываете в mainProp. Отдельно не хранится ...

Patric 17.12.2018 12:54
Ответ принят как подходящий

Я решил эту проблему, используя свойство ниже в аннотации @JsonProperty:

@JsonProperty(access = Access.WRITE_ONLY)

Другие вопросы по теме