Жестко закодированный @RequestMapping URL в Spring MVC Controller - PullRequest
6 голосов
/ 01 декабря 2011

Я изучаю Spring 3 и использую его в простом веб-приложении.

Сейчас я реализую Spring MVC Controller с использованием аннотаций, и мне интересно: есть ли что-нибудь лучшее?попрактиковаться в использовании @RequestMapping аннотации?

Я имею в виду: я видел, что обычно URL, указанный в этой аннотации, жестко закодирован в классе ... Есть ли способ передать URL "слабосвязанным способом" (чтобы получить класс многократного использования)?

Я знаю, что есть групповые символы это можно использовать, но я думаю, что это не решение ... Я не прав?

РЕДАКТИРОВАТЬ:

Я добавляю пример, чтобы лучше объяснить мои сомнения.

Предположим, я хочу, чтобы мой контроллер был запущен по запросу /foo/bar/baz/mypage.htm, в моем контроллере метод обработчика будет помечен @RequestMapping("/foo/bar/baz/mypage").

Теперь я решил изменить URLзапуск моего контроллера в /foo/bar/otherpage.htm, поэтому мне нужно отредактировать мой класс, добавить @RequestMapping("/foo/bar/otherpage") в мой метод-обработчик, перекомпилировать проект и развернуть его снова.

Мне кажется, это не очень практично ...

Ответы [ 3 ]

5 голосов
/ 01 декабря 2011

В настоящее время аннотированные контроллеры не очень настраиваемы.

Насколько я знаю, единственный возможный подход к этой проблеме - использовать альтернативные HandlerMapping s для настройки ".базовые URL-адреса "контроллеров.Например, следующим образом:

// Note the absense of @Controller to prevent this controller
// from being discovered by DefaultAnnotationHandlerMapping
public class FooController {
    @RequestMapping("/list") public String list(...) { ... }
    @ReqeustMapping("/save") public String save(...) { ... }
}

.

<bean 
    class = "org.springframework.web.servlet.mvc.support.ControllerBeanNameHandlerMapping" />

<bean name = "/foo" class = "FooController" />
<bean name = "/bar" class = "FooController" />

В этом примере два экземпляра FooController обрабатывают /foo/list, /foo/save, /bar/list и /bar/save соответственно.

Предстоящий Spring 3.1 будет иметь улучшеннуюАрхитектура Spring 3.1 ( Spring 3.1 M2: Улучшения Spring MVC ), которая кажется более гибкой, хотя я еще не проверял ее.

1 голос
/ 01 декабря 2011

Я думаю, что вы пытаетесь решить не ту проблему.Если вы хотите изменить страницы, которые соответствуют контроллеру, вам нужно где-то изменить файл.Вы бы предпочли изменить файл с соответствующим кодом под ним, или , вы бы предпочли работать с некоторыми XML-файлами, в которых указан URL-адрес и класс, и тогда вам придется беспокоиться о том, что файл находится в нужном местево время выполнения?

Поскольку в вашем контроллере почти не должно быть кода, все равно вы должны думать о своих контроллерах как о скомпилируемых файлах конфигурации.Кроме того, если вы используете систему сборки, такую ​​как Maven или Ant , и не компилируете отдельные файлы вручную с использованием Javac, тогда время компиляции не должно быть проблемой.Если он станет единым целым, возможно, пришло время разделить ваш проект на подпроекты.

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

Если вы действительно хотите, вы можете просто вернуться к конфигурации XML в стиле Spring 2.0 , но я не думаю, что кто-то порекомендует это.

0 голосов
/ 01 декабря 2011

Я думаю, что это не лучшая практика, но вы пробовали использовать аннотации @PathVariable?

 @RequestMapping(value="/path/{word}", method=RequestMethod.GET)
public ModelAndView myRestMethod(@PathVariable String word) {
    ...
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...