Доступ к абсолютному пути к ресурсу при использовании @RequestMapping в весеннем контроллере загрузки

Я использую @RquestMapping для сопоставления URL-адреса с методом контроллера.

@RestController
@RequestMapping(path = "/api/tasks")
public class TaskController { ....

и методы внутри контроллера имеют /{id} с аннотациями сопоставления запросов.

 @RequestMapping(
    path = "/{taskId},
    method = RequestMethod.GET
)
public Map<String, Object> methodOne(...

Я хочу получить доступ к методу http и абсолютному пути (настроенному пути) для этого метода внутри.

т. е. я хочу получить /api/tasks/{taskId} в качестве значения (а не /api/tasks/1, если API вызывается для задачи с идентификатором 1) и GET в качестве метода внутри methodOne.

Я проверил HandlerMapping, но он возвращает фактический путь к ресурсу, вызываемому клиентом. Не настроен путь для метода/ресурса.

Любая помощь или руководство будут высоко оценены. Спасибо.


person Community    schedule 08.02.2018    source источник


Ответы (3)


@RequestMapping(path = "/{id}", method = [RequestMethod.DELETE])
public void test(@PathVariable("id") String id, HttpServletRequest request) {
   \\ Code Here
}

В параметре метода id — это pathVariable. И метод запроса доступен в переменной запроса (хотя я не знаю, в чем смысл, поскольку вы ограничиваете его только приемом запросов GET)

person Codetector    schedule 08.02.2018
comment
Есть ли способ без изменения определения метода? У меня нет запроса в качестве параметра для любого из моих методов контроллера. У меня есть другие методы обработки get/post/delete/put. Я хочу получить путь и метод для каждого метода, а затем получить некоторые настройки для этого соответствующего вызова. - person ; 09.02.2018
comment
@RequestMapping(path = /{id}, method = RequestMethod.GET) methodOne(@PathVariable(id) String id) - person Stéphane GRILLON; 09.02.2018
comment
@sgrillon Я могу получить доступ к переменной пути, но я хочу получить доступ к абсолютному пути запроса. это /api/tasks/{id}, который сопоставляется с сопоставлением запросов. Прямо сейчас с объектом запроса я мог получить только /api/tasks/1 или любой другой запрашиваемый идентификатор задачи. Я хочу получить настроенный путь. - person ; 09.02.2018

Как предложил @codedetector, лучший вариант — если у вас есть объект запроса или вы можете добавить его, если у вас его нет.

@RequestMapping(path = "/{taskId}, method = RequestMethod.GET)
public String methodOne(HttpServletRequest request){
   String test = request.getRequestURI();
   return test;
 }

Если у вас нет объекта запроса в вашем методе, с помощью приведенного ниже кода вы можете получить любой URL-адрес в вашей системе.

import org.springframework.hateoas.mvc.ControllerLinkBuilder
 ...
ControllerLinkBuilder linkBuilder =  ControllerLinkBuilder.linkTo(methodOn(YourController.class).getSomeEntityMethod(parameterId, parameterTwoId))

URI methodUri = linkBuilder.Uri()
String methodUrl = methodUri.getPath()

-------- Редактировать Я не уверен, почему вам нужно в этом формате "/api/tasks/{taskId}" как значение (не /api/tasks/1 ), но я могу думать об использовании постоянного использования это для вашего параметра пути @RequestMapping, а затем легко после получения абсолютного пути замените/добавьте его этой константой.

String pathParam ="/{taskId}"
person surya    schedule 09.02.2018
comment
Он не возвращает путь, настроенный в аннотации контроллера. он возвращает `api/tasks/1 или любой другой идентификатор. - person ; 09.02.2018
comment
какой вариант вы пробовали, используя объект запроса или построитель ссылок? - person surya; 09.02.2018
comment
api/tasks находится в аннотации вашего контроллера. что мне не хватает? - person surya; 09.02.2018
comment
Да. Я пробовал первый раньше, но играл с ControllerLinkBuilder. Но это также дает мне фактический путь API, а не настроенный. Контроллер сопоставлен с /api/tasks и методом как /{taskId}, я хочу получить настроенный путь, т.е. /api/tasks/{taskId}. Прямо сейчас все, что я пробовал, возвращает /api/tasks/1 - person ; 09.02.2018
comment
это тоже мое запасное решение. я создал вспомогательный компонент, чтобы вернуть абсолютный путь. Я хотел полностью избавиться от накладных расходов, думая, есть ли какой-то метод, который Spring использует для сопоставления шаблонов сопоставления запросов с вызываемым URL-адресом клиентами. но эти методы являются частными в обработчиках запросов. - person ; 10.02.2018

person    schedule
comment
Обратите внимание, что код читается гораздо больше раз, поэтому использование рефлексии не усложняете все дело, у вас даже есть некоторая строковая константа для имени метода, так почему бы вам просто не использовать константу для {taskId} - person surya; 11.02.2018