Подтвердить что ты не робот

Spring Отображение MVC-запроса, может ли оно быть динамическим/настраиваемым?

С Spring MVC, я знаю, как вы устанавливаете RequestMapping в каждом контроллере и методе/действии.

Но что, если я хочу, чтобы это было настраиваемо, например, я следующие контроллеры:

BlogController 
 - with methods for listing blogs entries, single entry, new, update, etc.
ArticleController
 - with methods for listing articles entries, single entry, new, update, etc.

Теперь в моем приложении администратор может настроить 2 блогов для webiste и 1 раздел статьи, чтобы URL-адреса были такими:

www.example.com/article_section1/ - uses ArticleController
www.example.com/blog1/ - uses BlogController
www.example.com/blog2/ - uses BlogController

Может быть, через некоторое время администратор захочет получить другой раздел статьи, поэтому они просто настраивают это с помощью следующего раздела:

www.example.com/article_section2/

Это должно работать динамически/ "на лету" без необходимости повторного запуска приложения.

Мой вопрос касается только того, как я буду обрабатывать сопоставления URL-адресов моим контроллерам.

Как это возможно с помощью Spring MVC?

Я знаю, как сопоставлять URL-адреса контроллерам с помощью @RequestMapping("/helloWorld") на уровне контроллера или метода, но это делает сопоставления url фиксированными и не настраиваемыми, как то, как я хочу.

Update:

Я буду хранить пути в базе данных и сопоставлять их с типом контроллера так:

path                  controller
/article_section1/    article
/blog1/               blog
/blog2/               blog
..

С приведенной выше информацией, как я мог отправить запрос правильному контроллеру?

Опять же, не глядя на перезагрузку/повторное развертывание, и я понимаю, что для этого потребуется больше работы, но в спецификации:)

4b9b3361

Ответ 1

Будет ли это сортировать URL-адрес для вас?

www.example.com/blog/1/
www.example.com/blog/2/

Если да, то это легко: Spring 3 поддерживает переменные пути: http://static.springsource.org/spring/docs/3.0.x/reference/mvc.html#mvc-ann-requestmapping-advanced

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

Ответ 2

Поистине изменение сопоставлений запросов во время выполнения может быть затруднительным (и не рекомендуется, так как небольшие ошибки могут легко возникнуть). Если вы все еще хотите это сделать, возможно, JRebel, и, более конкретно, LiveRebel может быть интересен для живого перевода кода и конфигурации.

В противном случае, как и другие опубликованные сообщения, RequestMappings поддерживает подстановочные знаки, пределы этого должны быть понятны после быстрого ознакомления с официальной документацией.

Ответ 3

Попробуйте использовать с @RequestMapping wild cards, как показано ниже:

@RequestMapping(value="/article_section*/"}
public void getArticle(....){
//TODO implementation
}

@RequestMapping(value="/blog*/"}
public void getBlog(....){
//TODO implementation
}

Надеюсь, это поможет!!!

Ответ 4

Также другим решением может быть создание пользовательской аннотации, которая содержит уже определенный путь в @RequestMapping а также новый применяемый @ApiRestController скажем, @ApiRestController.

Затем, до загрузки контекста Spring, классы @Controller можно изменить, чтобы их значения аннотаций изменялись во время выполнения на новый (с требуемым путем). Делая это, Spring загрузит расширенное сопоставление запросов, а не по умолчанию.

Создан небольшой проект, чтобы проиллюстрировать это для кого-то, кто нуждается в этом в будущем https://gitlab.com/jdiasamaro/spring-api-rest-controllers.

Надеюсь, поможет. Приветствия.

Ответ 5

разве это не работает? @RequestMapping ( "/HelloWorld *" )