Джексон десериализует List <String> как свойство POJO

У меня есть класс POJO, который будет десериализован из JSON, который поставляется весной как RequestBody. Этот класс POJO содержит List<String> в качестве переменной экземпляра. Когда эта переменная десериализована, значение равно null. Как правильно его десериализовать? Ниже приведены примеры кода Мой POJO выглядит так, как показано ниже

@Getter
@AllArgsConstructor
@NoArgsConstructor
public class BookDto {
@JsonProperty("bookName")
private String bookName;
@JsonProperty("authors")
private List<String> authors;
@JsonProperty("description")
private String description;
}

Мой объект JSON выглядит так, как показано ниже

{
 "bookName":"Vagrant Up and Running",
 "authors":["aone", "atwo"],
 "description":"Getting started guide for Vagrant development"
}

Ниже приведен пример вызова метода

public void method(@RequestBody BookDto bookDto) {}

Я последовал данному предложению, и код десериализатора приведен ниже.

public class AuthorDeserializer extends JsonDeserializer<List<String>> {
@Override
public List<String> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
    Author author = jsonParser.readValueAs(Author.class);
    return author.authors;
}

private static class Author {
    public List<String> authors;
}
}

Это не может быть вашим настоящим кодом: все поля являются частными, и нет никакого способа получить их значения. Отправьте вам актуальный код.

JB Nizet 15.09.2018 15:53

Я использовал плагин lombok для геттеров и конструкторов

the_tech_maddy 15.09.2018 16:13

Разместите свой фактический код.

JB Nizet 15.09.2018 16:27

@Madhusudhanan Как вы его десериализуете? Пожалуйста, отправьте код

Maruthi Adithya 15.09.2018 16:34

Я не могу воспроизвести (хотя я не использую Lombok, а просто сгенерировал код, который он должен генерировать на основе аннотаций). Проверьте свой ввод. убедитесь, что у вас нет опечатки. Попробуйте написать модульный тест, который просто десериализует JSON.

JB Nizet 15.09.2018 16:38

@JBNizet Хорошо, я проверю. Спасибо

the_tech_maddy 15.09.2018 16:42

@Madhusudhanan, я не смог воспроизвести вашу проблему, так как она работает, найдите даже без вашего пользовательского десериализатора, пожалуйста, найдите мою версию на github.com/moband/spring-boot-lombok

MohammadReza Alagheband 15.09.2018 18:26
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
Как вычислять биты и понимать побитовые операторы в Java - объяснение с примерами
В компьютерном программировании биты играют важнейшую роль в представлении и манипулировании данными на двоичном уровне. Побитовые операции...
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Поднятие тревоги для долго выполняющихся методов в Spring Boot
Приходилось ли вам сталкиваться с требованиями, в которых вас могли попросить поднять тревогу или выдать ошибку, когда метод Java занимает больше...
Полный курс Java для разработчиков веб-сайтов и приложений
Полный курс Java для разработчиков веб-сайтов и приложений
Получите сертификат Java Web и Application Developer, используя наш курс.
0
7
3 826
2

Ответы 2

Сделайте поля Public или добавьте геттеры, чтобы сделать их десериализованными.

Обратитесь к это для получения дополнительных сведений

Если вы используете Lombok, рассмотрите возможность добавления этой аннотации @Data, как показано ниже:

@Data //You can remove the @Getter and @Setter annotation since @Data includes them
@NoArgsConstructor
public class BookDto {
   private String bookName;
   private List<String> authors;
   private String description;
}

Примечание: это не связано с проблемой, но удалите @JsonProperty() для ясности, эта аннотация бесполезна в вашем случае, поскольку свойства вашего объекта JSON имеют то же имя, что и свойства вашего DTO, и по умолчанию ObjectMapper использует имена для сопоставления свойств.

Обновлено:@RequestBody десериализует JSON за вас, поэтому вам не нужно делать это вручную.

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