Как определить приоритеты RequestMapping
У меня есть ситуация, когда мне нужно следующее RequestMapping
:
@RequestMapping(value={"/{section}"})
...method implementation here...
@RequestMapping(value={"/support"})
...method implementation here...
Существует очевидный конфликт. Я надеялся, что Spring разрешит это автоматически и отобразит /support
ко второму методу, а все остальное к первому, но вместо этого он отображает /support
к первому способу.
Как я могу сказать Spring, чтобы разрешить явное RequestMapping
переопределить RequestMapping
с PathVariable
в том же месте?
Редактировать 2: Кажется, что это будет работать, если /support
картографирование пришло раньше /{section}
отображение. К сожалению, у нас есть десятки контроллеров, содержащих многочисленные методы с RequestMapping
, Как я могу убедиться, что контроллер с /{section}
отображение инициализируется последним? Или будет пре-перехватчик?
Редактировать 1: Это упрощено, я знаю, что с этими двумя RequestMapping
само по себе не имеет особого смысла)
4 ответа
Используя Spring, вы можете расширить org.springframework.web.HttpRequestHandler для поддержки вашего сценария.
Реализуйте метод:
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {}
Используйте его для анализа входящего запроса, определения, является ли URL-адрес частью вашего специального подмножества URL-адресов запроса, и переадресация в соответствующее местоположение.
Пример:
@Override
public void handleRequest(HttpServletRequest request, HttpServletResponse response) throws ServletException, IOException {
/** You will want to check your array of values and have this data cached **/
if (urlPath.contains("/sectionName")) {
RequestDispatcher requestDispatcher = request.getRequestDispatcher("sections" + "/" + urlPath);
requestDispatcher.forward(request, response);
}
}
И настройте свои разделы, такие как:
@RequestMapping(value={"/sections/{sectionName}"})
Это не будет мешать любому из ваших ранее существующих сопоставлений контроллера.
Это не кажется проблемой, это правильное отображение. Если вы посмотрите на http://static.springsource.org/spring/docs/current/spring-framework-reference/html/mvc.html
В разделе 16.3.2 Отображение запросов с помощью @RequestMapping существует два метода, которые делают то же самое, что и вы.
Чтобы быть уверенным в том, что ваши классы компилируются, попробуйте добавить @RequestMapping("/someprefix") на уровне класса, чтобы увидеть, отображается ли URL-адрес так, как вам нужно.
Я проверяю ваш пример локально, используя версию 3.1.0.RELEASE, и никаких проблем не было.
В качестве обходного пути (а также для обеспечения понятного REST URI добавьте некоторый контекст во второе отображение:
@RequestMapping(value={"client/support"}) // i.e: if you are working with clients
public ModelAndView getsupport(@PathVariable Long supportId){
// do your code here something here
}
Конечно, это действительно, если это уникальный контроллер, присутствующий в системе, в противном случае вы должны использовать RequestMapping на уровне класса, как я предлагал выше.
Надеюсь, это поможет.
Если 2 этих метода определены в 2 разных контроллерах, ваша проблема заключается в том, что у вас есть 2 контроллера, сопоставленные одному и тому же URL. Вы не управляете порядком инициализации контроллеров прямо сейчас, поэтому порядок является случайным.
Я думаю тебе нужно /support
отображение должно быть инициализировано до /{section}
,
Для этого попытайтесь определить, что "секция" контроллера зависит от "поддержки" контроллера. Если это не поможет, попробуйте соединить оба метода на одном контроллере и сопоставить метод с "support" перед "section"
Я это не работает, вот другое предложение. Что такое "раздел"? Если он может принимать ограниченное количество значений, он должен быть определен как enum
, Я считаю, что в этом случае все будет работать так, как требуется, если методы поддержки и секций находятся в одном контроллере или в отдельных контроллерах.
Удачи.
Я не вижу такого поведения в Spring 3.1.2, это могло быть ошибкой в более старой версии Spring. Вот суть, которая проходит без проблем для меня - https://gist.github.com/3802254