У меня есть класс 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;
}
}
Я использовал плагин lombok для геттеров и конструкторов
Разместите свой фактический код.
@Madhusudhanan Как вы его десериализуете? Пожалуйста, отправьте код
Я не могу воспроизвести (хотя я не использую Lombok, а просто сгенерировал код, который он должен генерировать на основе аннотаций). Проверьте свой ввод. убедитесь, что у вас нет опечатки. Попробуйте написать модульный тест, который просто десериализует JSON.
@JBNizet Хорошо, я проверю. Спасибо
@Madhusudhanan, я не смог воспроизвести вашу проблему, так как она работает, найдите даже без вашего пользовательского десериализатора, пожалуйста, найдите мою версию на github.com/moband/spring-boot-lombok




Сделайте поля 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 за вас, поэтому вам не нужно делать это вручную.
Это не может быть вашим настоящим кодом: все поля являются частными, и нет никакого способа получить их значения. Отправьте вам актуальный код.