У вас нет конструктора по умолчанию, но есть конструктор arg.
Вы должны аннотировать его с помощью @JsonCreator
, чтобы Джексон использовал его для десериализации JSON:
@JsonCreator
public Event(Days day, String name) {
this.day = day;
this.name = name;
}
Чтобы сериализовать объект Java в JSON, Джексон не использует конструкторпоскольку он не создает экземпляры Java, а просто использует методы получения для получения его свойств.Так это сработало.Но чтобы десериализовать JSON в объект Java, Джексону нужно создать экземпляр целевого класса.По умолчанию он ищет конструктор без аргументов.
Обратите внимание, что аннотирование параметров конструктора с помощью @JsonProperty("...")
не требуется, если вы используете ParameterNamesModule
, например:
ObjectMapper objectMapper = new ObjectMapper();
objectMapper.registerModule(new ParameterNamesModule());
Spring Boot 2 обеспечивает этодля вас, поскольку вы зависите от Джексона.
Здесь вам это нужно, потому что вы не используете проводку Mapper от Spring Boot, а создаете ее сами.
А также аннотации @JsonProperty
, расположенные вперечисление также не требуется:
public enum Days {
@JsonProperty("Monday")
MONDAY("Monday"),
@JsonProperty("Tuesday")
TUESDAY("Tuesday");
//...
}
Это позволяет изменить вывод сериализации перечисления, но на самом деле вам не нужно изменять его, поскольку вы сопоставляете его со значением поля day
, используемым в настоящее время дляперечисление Джексона ...