Добавить префикс к URL-адресам всех классов контроллера в пакете

125
13

Я разрабатываю службу RESTful, используя Spring 3.0, работающий в среде Tomcat Apache 6.0. Диспетчер Spring DispatcherServlet настроен на "/spring/*". Сервлет Spring обрабатывает несколько клиентов и имеет много контроллеров в приложении. Я добавляю новый контроллер для службы REST. Я хочу, чтобы все мои классы контроллеров имели идентификационный префикс типа "ws" (веб-сервис), чтобы весь URL-адрес ресурса выглядел следующим образом:   http://<server>:<port>/<context>/spring/ws/service1


Единственный способ, которым я нашел с аннотацией Spring, - это использовать @RequestMapping следующим образом:


@Controller
@RequestMapping("/ws/service1")
public class Service1 {

@RequestMapping(method=RequestMethod.GET)
@ResponseBody
public String getHtml() { ... }

....
}


Но поскольку у меня есть десятки классов, я не хочу ставить префикс "/ws" в каждом классе. Так что, если другой разработчик добавит новую услугу, ему не нужно забывать ставить этот префикс, а также если мы решили изменить имя префикса из "/ws" на что-то еще, мне не нужно менять все файлы. Я обнаружил, что аннотация @RequestMapping применима только к методам или классам, а не к уровню пакета.


Можно ли каким-либо образом настроить, чтобы все мои контроллеры REST были доступны с префиксом?


Обратите внимание, что я не могу изменить URL-адрес URL-адреса web.xml для сервлета Spring, поскольку есть другие контроллеры, которые работают с этим URL-адресом.

спросил(а) 2021-01-25T19:16:39+03:00 5 месяцев назад
1
Решение
109

Возможно, вы захотите посмотреть соглашение по конфигурации поддержка Spring 3, в частности ControllerClassNameHandlerMapping. Фактически вы не определяете местоположение URL-адреса в @RequestMapping, но оно определяется положением пакета обработчика.


Если вы хотите, чтобы отображаемые URL-адреса отображали имя пакета контроллера, вы должны установить свойство basePackage ControllerClassNameHandlerMapping. документация говорит


Установите базовый пакет, который будет использоваться для создания сопоставлений путей, включая все подпакеты под этими пакетами в качестве элементов пути. Значение по умолчанию равно null, используя короткое имя класса для сгенерированного пути, при этом пакет контроллера не представлен в пути. Укажите базовый пакет, например "com.mycompany.myapp", чтобы включить подпакеты в этом базовом пакете в качестве элементов пути, например. генерируя путь "/mymodule/buyform" для имени класса "com.mycompany.myapp.mymodule.BuyForm". Иерархии субпакетов представлены как отдельные элементы пути, например. "/mymodule/mysubmodule/buyform" для имени класса "com.mycompany.myapp.mymodule.mysubmodule.BuyForm".



Итак, пример beans может быть

<bean class="org.springframework.web.servlet.mvc.support.ControllerClassNameHandlerMapping">
<property name="basePackage" value="com.company.project"/>
</bean>
<context:component-scan base-package="com.company.project.ws"/>

И ваши контроллеры могут выглядеть как


package com.company.project.ws;
@Controller
public class Service1 {
// your controller methods
}

ответил(а) 2021-01-25T19:16:39+03:00 5 месяцев назад
45

Другой подход (очень простой и простой), который я реализовал, заключался в том, чтобы определить несколько сервлетов диспетчера, а затем отобразить разные URL-адреса для каждого сервлета. Сервлеты совместно используют корневой контекст Spring и, кроме того, имеют свои собственные определения bean. Подробнее читайте в этом Java doc.


Итак, мой web.xml выглядит так:

<servlet>
<servlet-name>flex</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>1</load-on-startup>
</servlet>

<!-- Mappings for BlazeDS requests -->
<servlet-mapping>
<servlet-name>flex</servlet-name>
<url-pattern>/spring/messagebroker/*</url-pattern>
</servlet-mapping>

<!-- Second dispatcher servlet for Web Services API -->
<servlet>
<servlet-name>wsapi</servlet-name>
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
<load-on-startup>2</load-on-startup>
</servlet>
<servlet-mapping>
<servlet-name>wsapi</servlet-name>
<url-pattern>/spring/ws/*</url-pattern>
</servlet-mapping>


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

ответил(а) 2021-01-25T19:16:39+03:00 5 месяцев назад
Ваш ответ
Введите минимум 50 символов
Чтобы , пожалуйста,
Выберите тему жалобы:

Другая проблема