2015-04-06 4 views
2

У меня есть контроллер аннотированного отдыха, как показано ниже. Я в состоянии получить услуги для размещения в порядке, но только если я настроить полный путь для каждого отдельного сервиса в web.xml:Spring 4 RestController Dispatcher url-pattern

@RestController 
@RequestMapping("/service/") 
public class StuffRestController 
{ 
    @RequestMapping("/getStuffList") 
    public List<Stuff> getStuffList() { 
     ... make stuff ... 
     return stuffList; 
    } 

    ... many other similar services ... 
} 

Это действительно единственный источник ресурсов в моем приложении; хотя, мы используем весеннюю безопасность.

Ниже являются только линии spring4-servlet.xml:

класс
<mvc:annotation-driven /> 

<context:component-scan base-package="com.me.stuff.presentation.controller" /> 
<context:component-scan base-package="com.me.stuff.security" /> 

StuffRestController находится в "..." контроллер пакета.

web.xml:

<servlet>  
    <servlet-name>spring4</servlet-name>  
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>  
    <init-param> 
    <param-name>contextConfigLocation</param-name> 
    <param-value>WEB-INF/spring4-servlet.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup>  
</servlet> 
<servlet-mapping>  
    <servlet-name>spring4</servlet-name>  
    <url-pattern>/service/getStuffList</url-pattern> 
</servlet-mapping> 

Все вышеперечисленное на самом деле все работает нормально, и денди, но есть 30 других услуг в этом контроллере, и я предпочел бы не сделать новое отображение сервлета для каждого метода. Проблема возникает, когда я пытаюсь «подстановить» отображение. Я пробовал/сервис/,/сервис, и/сервис/*. И многие другие комбинации.

Большинство всего просто неправильно отображают карту, и я получаю 404 ошибки. Если я использую/обслуживание/* будет заниматься диспетчеру сервлет, когда// getStuffList называется сервис, но он отвечает:

WARNING: No mapping found for HTTP request with URI [/myapp/service/getStuffList] in DispatcherServlet with name 'spring4' 

Я уверен, что это что-то просто с тем, как создаются URL отображения, но ускользает от меня.

+0

Какой URL-адрес вы нажимаете? –

+0

«http: // localhost: 8080/myapp/service/getStuffList» ... который отлично работает, если у меня есть web.xml, настроенный так, как я делаю в сообщении, но я бы предпочел, чтобы улавливал весь шаблон URL для все/обслуживание/и ниже. – slambeth

ответ

4

Проблема заключается в том, что вы включили путь: /service/getStuffList как в свои DispatcherServlet, так и в карточку запроса @RestController. Таким образом, чтобы получить доступ к методу контроллера отдыха, вы, чтобы ударить по следующему адресу:

{contextPath}/service/getStuffList/service/getStuffList 

Таким образом, либо изменить диспетчерский сервлет URL-шаблон для /, поэтому он будет обрабатывать каждый запрос приходит к приложению, а затем основанный на пути после myApp, перенаправит соответствующий контроллер. Или, установите отображение RestController на /*. Вы должны предпочесть прежний подход.

Если вы хотите, чтобы запрос на обработку сервлета находился на /service, измените URL-адрес на /service/*. Но тогда вы должны удалить все сопоставления запросов с уровня класса. Иначе в текущем сценарии, вы, чтобы ударить по следующему адресу:

{contextPath}/service/service/getStuffList 

Однако, если вы хотите включить в диспетчерскую сервлета URL-шаблон в разрешении пути (то есть, вы хотите отобразить класс в /service, а также map servlet к этому пути), вы можете установить значение alwaysUseFullPath на true сопоставления обработчиков URL. Для этого добавьте следующее в ваш xml-файл весеннего контекста:

<bean class="org.springframework.web.servlet.mvc.annotation.DefaultAnnotationHandlerMapping"> 
    <property name = "alwaysUseFullPath" value = "true" /> 
</bean> 
+0

Спасибо, сэр ... У меня возникло непонимание того, как картирование взаимодействовало с аннотациями. Ваш ответ привел меня к выводу.Используя «/», как не вариант с этим приложением, мы просто добавляем весну для использования @RestController. Я изменил свое сопоставление на /spring/*, а [host]/[context]/spring/service/getStuffList отвечает, как я ожидаю сейчас. – slambeth

+0

@slambeth Добро пожаловать. BTW, вы также можете сопоставить его с '/ service/*' и установить свойство, как я цитировал в своем ответе, и просто использовать '/ service/getStuffList'. –

Смежные вопросы