Это могло быть рассмотрено в других топиках StackOverflow c, но я хотел бы знать причину и почему он работает.
Код выглядит ниже:
@Document
@JsonFormat(shape= JsonFormat.Shape.OBJECT)
@JsonAutoDetect()
public enum Compass {
north("Upper Center"),
south("Lower Center"),
east("Left Center"),
west("Right Center"),
ne("Upper Right"),
nw("Upper Left"),
se("Lower Right"),
sw("Lower Left"),
;
@JsonProperty
private String presentableName;
@JsonProperty
private String name;
private Compass() {}
private Compass(String presentableName) {
this.presentableName = presentableName;
}
public String getPresentableName() {
return presentableName;
}
public void setPresentableName(String presentableName) {
this.presentableName = presentableName;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
@JsonCreator
public static Compass fromObject(@JsonProperty("name") String name) {
return Compass.sw;
}
}
Десериализация не работает с приведенным выше кодом.
вложенным исключением является org.springframework.http.converter.HttpMessageNotReadableException: JSON ошибка синтаксического анализа: невозможно создать экземпляр Compass
(хотя существует хотя бы один создатель): нет конструктора аргумента строки или метода фабрики для десериализовать из строкового значения ('STRING'); вложенное исключение: com.faster xml .jackson.databind.ex c .MismatchedInputException
Теперь, если я использую приведенный ниже код с @JsonCreator
, он работает нормально.
@JsonCreator
public static TesterEnum fromObject(final Map<String, Object> obj) {
if (obj != null && obj.containsKey("id")) {
Integer id = null;
if (obj.get("id") instanceof Integer) {
id = (Integer)obj.get("id");
} else {
id = Integer.parseInt((String)obj.get("id"));
}
return fromId(id);
}
return null;
}
Мои вопросы:
- Почему работает вторая реализация?
- Как работает JsonCreator? Как это получить значения в параметре метода
fromObject