Как определить приоритеты 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

Другие вопросы по тегам