Десериализация EnumMap с использованием Джексона - PullRequest
0 голосов
/ 19 января 2020

Я добавил аннотацию @JsonAnySetter к методу addProperty

Map<MyEnum, String> mymap = new EnumMap<>(MyEnum.class);

@JsonAnySetter
public void addProperty(MyEnum key, Object value) {
    mymap.put(key, value);
}

, но при десериализации я получаю следующую ошибку

com.faster xml .jackson.databind.JsonMappingException: недопустимая аннотация «any-setter» для метода «addProperty ()»: первый аргумент не типа String или Object, но java .lang.Enum

If Я изменяю карту на простой HashMap с ключом типа String, тогда он работает нормально.

Может кто-нибудь сообщить мне, что нужно сделать для десериализации в EnumMap

Ответы [ 2 ]

0 голосов
/ 19 января 2020

Кажется, что аннотация @JsonAnySetter работает только с ключами типа String или Object.

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

Использовать аннотацию @JsonAnySetter для перегруженного метода.

Map<MyEnum, String> mymap = new EnumMap<>(MyEnum.class);

public void addProperty(MyEnum key, Object value) {
    mymap.put(key, value);
}

@JsonAnySetter
private void addProperty(String key, Object value) {
    addProperty(MyEnum.valueOf(key), value);
}

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

@JsonAnySetter аннотация работает с private методами.

0 голосов
/ 19 января 2020

В документации говорится, что:

Первый аргумент - это имя свойства, поэтому оно должно быть String.

Вы можете преобразовать его в Enum в своем методе set.

...