Добавьте префикс к URL-адресам всех классов контроллера в пакете - PullRequest
7 голосов
/ 13 июля 2011

Я занимаюсь разработкой службы 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 web.xml сервлета Spring, поскольку существуют другие контроллеры, работающие с этим URL.

Ответы [ 2 ]

5 голосов
/ 14 июля 2011

Возможно, вы захотите взглянуть на соглашение о конфигурации поддержку 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".

Итак, пример bean-компонентовопределение может быть

<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
}
0 голосов
/ 16 июля 2011

Другой подход (очень простой и простой), который я реализовал, состоял в том, чтобы определить несколько сервлетов Dispatcher и затем отобразить различные 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 на каждом контроллере.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...