Нет подходящего компонента типа доступно исключение

#java #spring-boot #jackson

Вопрос:

Я пытаюсь десериализовать хэш-карту с помощью Джексона. Моя структура данных такова

 public class FilterDto {

    private Map<String, List<String>> sectorFilter;

    public FilterDto() {}

    public Map<String, List<String>> getSectorFilter() {
        return sectorFilter;
    }

    public void setSectorFilter(Map<String, List<String>> sectorFilter) {
        this.sectorFilter = sectorFilter;
    }

}
 

Мое тело запроса-это

 {
  "sectorFilter": [
    {
      "ab": [
        "abc",
        "cde"
      ]
    }
  ]
}
 

Когда я попытался десериализовать это, я получил

 Cannot deserialize instance of `java.util.Map<java.lang.String,java.util.List<java.lang.String>>` out of START_ARRAY token
 

Поэтому я попытался использовать пользовательский десериализатор, чтобы посмотреть, сработает ли он. Я создал пользовательский deerialzer, как показано ниже

 public class FilterDeserializer  extends StdDeserializer<Map<String,List<String>>> {


    public FilterDeserializer(StdDeserializer<?> src) {
        super(src);
    }

    @Override
    public Map<String,List<String>> deserialize(JsonParser jsonParser, DeserializationContext deserializationContext) throws IOException, JsonProcessingException {
        
    }
}
 

и добавил его в свой dto

 @JsonDeserialize(using = FilterDeserializer.class)
private Map<String, List<String>> sectorFilter;
 

но теперь я получаю

 No qualifying bean of type 'com.fasterxml.jackson.databind.deser.std.StdDeserializer<?>' available: expected at least 1 bean which qualifies as autowire candidate. Dependency annotations: {}
 

есть идеи, как я могу получить эту работу ? Спасибо

Комментарии:

1. измените свой «Фильтр секторов» в запросе на объект(начинайте и заканчивайте с {} не []) или, если это массив, вы должны изменить «Карта<Строка, список<Строка><Строка>>» на список карты «Список<Строка>><Карта<Строка, список<Строка><Строка>><Строка>>»

2. @Dilantha, пожалуйста, подумайте о том, чтобы проголосовать и принять приведенный ниже ответ, чтобы вопрос можно было «закрыть» и другие могли извлечь из него пользу 😉 Спасибо!

Ответ №1:

sectorFilter как вы показали , это не карта, а массив объектов JSON. Попробуйте десериализоваться как List<Map<String, List<String>>> . Конечно, вы также можете создавать классы, имитирующие эту структуру, если хотите.