Как проверить имя параметра GET запроса в Sping?

Для маппинга GET запроса использую аннотацию @GetMapping:

@GetMapping(params = {ParameterName.SORT_BY})
    public List<GiftCertificate> findAllSorted(@RequestParam(value = ParameterName.SORT_BY) Set<ColumnName> columnNames) {

        return service.findAllSorted(columnNames);
    }

ParameterName.SORT_BY - это обычный enum.

По запросу:

http://localhost:8080/gift-certificates?sort_by=name

я попадаю в данный метод, всё нормально. Но почему при указании параметра ``, которого не существует в маппинге, по запросу:

http://localhost:8080/gift-certificates?sort_ABRAKADABRA_by=name

Я попадаю в данный метод:

@GetMapping
    public List<GiftCertificate> findAll() {
        return service.findAll();
    }

Почему и как сделать проверку параметров GET запроса?

P.S. Вот это уровень, когда минусатор боится объявиться в комментариях и тыкают наугад причину закрытия вопроса, потому что подходящей не существует. Это ж как должно бомбить пуканы :)


Ответы (1 шт):

Автор решения: s1mple.human

Если просто проверить параметры

Первое что пришло мне в голову пришло, это проверять запрос на возможные параметры примерно так:

@GetMapping
public List<GiftCertificate> findAll(HttpServletRequest request) {
    if (!request.getParameterMap().isEmpty())
        return; // Любое действие, если параметры есть
    return service.findAll();
}

Вариант с опциональными параметрами

В вашем случае напрашивается другой способ решения - сделать эндпоинт со всеми возможными параметрами и обрабатывать их наличие или отсутствие. Небольшой примерчик:

@GetMapping()
public List<GiftCertificate> findAllSorted(
        @RequestParam(value = "foo", required = false) Optional<String> nonRequiredFoo,
        @RequestParam(value = "bar") String requiredBar) {
    if (nonRequiredFoo.isPresent()){
        return service.findAllSorted(columnNames);
    }
    return service.findAll();
    
}

Ссылочка на почитать: https://www.baeldung.com/spring-request-param

→ Ссылка