Список перечислений в объекте @RequestParam - PullRequest
0 голосов
/ 26 мая 2020

Скажем, у меня есть конечная точка GET в контроллере загрузки Spring, который принимает объект как @ RequestParam

@GetMapping(value = "/foos")
public List<Foo> getFoos(@RequestParam FilterParams filterParams) {
  return fooDao.getFoos(filterParams);
}

, где FilterParams - это класс, который содержит атрибут List (или любой другой список объектов)

public class FilterParams {
  public List<Bar> bars;
}

и Bar является перечислением (для этого примера)

public enum Bar {
  Baz, Zap
}

Если мы отправим запрос GET на эту конечную точку со списком атрибутов filterParameter, разделенных "," т.е. curl -X GET localhost:8080/foos?bars=BAZ,ZAP , Spring не может проанализировать его как список и пытается десериализовать одно единственное значение BAZ,ZAP в перечисление. Если бы это не было перечисление, оно также вел бы себя так же, т.е. десериализовало бы параметр id = 1,2 в один элемент списка строк. Можно ли изменить это поведение? И если да, то как этого добиться?

Я знаю, что могу добиться этого, объявив несколько параметров как /foos?bars=BAZ&bars=ZAP, но для меня это неудобно

1 Ответ

0 голосов
/ 26 мая 2020

Я не думаю, что параметры запроса будут преобразованы в объект. Еще один способ справиться с этим случаем - объявить параметр запроса как String. Обновите свою документацию, чтобы указать, что параметр запроса поддерживает значения, разделенные запятой. Вы можете проанализировать эту строку и сопоставить ее с перечислением. Этот подход поможет в долгосрочной перспективе, когда вы захотите поддерживать новые значения.

@GetMapping(value = "/foos")
public List<Foo> getFoos(@RequestParam("bars") String filterParams) {
// Parse the String using coma as delimiter, map the String to an enum so that enum can be passed arround in the code
  return fooDao.getFoos(filterParams);
}

Теперь должна работать передача следующего URL-адреса: curl -X GET localhost: 8080 / foos? Bars = BAZ, ZAP

Еще один подход - объявить параметр запроса как список.

@GetMapping(value = "/foos")
public List<Foo> getFoos(@RequestParam("bar") List<String> filterParams) {
// Parse the String using coma as delimiter, map the String to an enum so that enum can be  passed arround in the code
  return fooDao.getFoos(filterParams);
}

В этом случае URL-адрес может стать длинным в зависимости от количества параметров, поддерживаемых вашей службой: curl -X GET локальный: 8080 / foos? bar = BAZ & bar = ZAP

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...