Сопоставьте 2 метода контроллера с одной и той же конечной точкой с разными параметрами запроса

Я хочу реализовать REST API на Java с «перегруженной» конечной точкой, которая отличается переданными параметрами запроса.
Я пробовал этот код в своем классе контроллера:

@Get("/query")
public MyResponse queryByDate(@QueryValue @Valid @Format("yyyy-MM-dd") Date date) {
    // Code to generate the response
    return retval;
}

@Get("/query")
public MyResponse queryByDateAndValue(@QueryValue @Valid @Format("yyyy-MM-dd") Date date, @QueryValue int value) {
    // Code to generate the response
    return retval;
}

Это возвращает следующую ошибку:

More than 1 route matched the incoming request. The following routes matched /calendar/years/query: GET - /calendar/years/query, GET - /calendar/years/query
io.micronaut.web.router.exceptions.DuplicateRouteException: More than 1 route matched the incoming request. The following routes matched /calendar/years/query: GET - /calendar/years/query, GET - /calendar/years/query

Обратите внимание: если я удалю один из методов, оставшийся метод будет работать должным образом. Как я могу сопоставить конечную точку с разными параметрами запроса с двумя разными методами в контроллере? Это возможно?

Спасибо.


person Jon Hill    schedule 30.10.2019    source источник


Ответы (2)


Вы получаете сообщение об ошибке, потому что обе конечные точки имеют одинаковый путь, и это сбивает компилятор с толку, чтобы сопоставить API с соответствующими путями. Передача параметров запроса не означает, что конечная точка имеет другой путь. Вы можете объединить эти 2 конечные точки в одну как:

@Get("/query")
public MyResponse queryByDateAndValue(@QueryValue @Valid @Format("yyyy-MM-dd") Date date,@DefaultValue("1")  @QueryValue int value) {
    // Code to generate the response
    return retval;
}

и установите значение по умолчанию value. Затем вы можете соответственно разделить свое дело.

person Rahul Agrawal    schedule 30.10.2019
comment
Хорошо, в этом есть смысл. Жаль, что вы не можете сделать это так же, как весной, но если Micronaut не поддерживает это, я думаю, это лучший вариант. Спасибо за совет. - person Jon Hill; 30.10.2019

Micronaut не учитывает параметры запроса при сопоставлении маршрута, поэтому разделение маршрутов по параметрам запроса никогда не сработает. Я бы посоветовал сделать то, что предложил @Rahul.

person James Kleeh    schedule 30.10.2019