Ошибка десериализации подтипа Джексона при запуске с gradle

Я получаю исключение при запуске интеграционного теста с gradle.

Исключение, которое я получаю:

com.fasterxml.jackson.databind.JsonMappingException: Can not construct instance of AbstractCommonDetails: abstract types either need to be mapped to concrete types, have custom deserializer, or contain additional type information

Класс Summary имеет следующие аннотации к деталям, которые я пытаюсь десериализовать:

@Data
public class Summary {
  @JsonTypeInfo(use = NAME, include = PROPERTY, property = "@type")
  @JsonSubTypes({
      @JsonSubTypes.Type(value = CardDetails.class, name = "CARD")
  })
  private AbstractCommonDetails details;
}

AbstractCommonDetails выглядит следующим образом:

@Getter
@Setter
public abstract class AbstractCommonDetails {
  private Long id;
  public abstract String getPaymentMethod();
}

А в CardDetails есть аннотации @JsonTypeName("CARD") и @Data и реализация метода getPaymentMethod.

Конфигурация и десериализация ObjectMapper выполняется следующим образом:

new ObjectMapper().findAndRegisterModules().readValue(IOUtils.toString(inputStream, "UTF-8"), Summary.class);

И образец json:

{
  "details":{
    "@type":"CARD",
    "amount":"10.00"
}

Странно то, что запуск интеграционного теста как теста Junit завершается успешно, но при запуске того же интеграционного теста с командой gradlew test происходит сбой с исключением, упомянутым ранее. Что может быть причиной?

Не могли бы вы показать нам, как выглядит класс AbstractCommonDetails? Как вы проводите Junit тест? В IDE или Maven?

Michał Ziober 25.02.2019 14:07

Тест Junit запускается в среде IDE. Выложил код AbstractCommonDetails

Janar 25.02.2019 14:54

если не работает с gradle значит нужно как-то настроить Lambok аннотации для работы. Не могли бы вы проверить, например, что Конфигурация annotationProcessor gradle 4.7+ не запускает ломбок

Michał Ziober 25.02.2019 15:18

Я попытаюсь удалить аннотации ломбока и запустить тесты, чтобы проверить, не в этом ли проблема.

Janar 25.02.2019 15:39

@MichałZiober удаление аннотаций ломбока действительно устранило проблему - я попытаюсь заставить его работать на примере с ломбоком. Благодарность!

Janar 25.02.2019 15:51
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
1
5
281
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Если тест работает на IDE, но не работает на gradle, значит, вам нужно взглянуть на конфигурацию gradle. Вы используете Lambook, поэтому вам нужно убедиться, что конфигурация gradle знает о Lambok аннотациях.

Смотрите также:

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