2012-04-20 16 views
9

Mam dziwny scenariusz, w którym mój kontroler nie jest wywoływany, chyba że zamapuję servlet wysyłający na/* w web.xml. Mam zdefiniowane kontroler z RequestMapping:Spring MVC @RequestMapping nie działa

@Controller 
public class UserController { 

    @RequestMapping(value = "/rest/users", method = RequestMethod.GET) 
    public ModelAndView getUsers(HttpServletRequest request) throws RestException { 
     ... 
    } 
} 

I kontekście aplikacji:

<?xml version="1.0" encoding="UTF-8"?> 
<beans xmlns="http://www.springframework.org/schema/beans" 
     xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" xmlns:util="http://www.springframework.org/schema/util" 
     xmlns:context="http://www.springframework.org/schema/context" 
     xmlns:mvc="http://www.springframework.org/schema/mvc" 
     xsi:schemaLocation=" 
     http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-2.5.xsd 
     http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-2.5.xsd 
     http://www.springframework.org/schema/util http://www.springframework.org/schema/util/spring-util-2.5.xsd 
     http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd"> 

    <context:component-scan base-package="com.test.rest.controller" /> 

Wreszcie to jest mapowany w web.xml:

<servlet> 
    <servlet-name>rest-servlet</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <init-param> 
     <param-name>contextConfigLocation</param-name> 
     <param-value>/WEB-INF/restContext.xml</param-value> 
    </init-param> 
    <load-on-startup>1</load-on-startup> 
</servlet> 

<servlet-mapping> 
    <servlet-name>rest-servlet</servlet-name> 
    <url-pattern>/*</url-pattern> 
</servlet-mapping> 

to działa zgodnie z oczekiwaniami, czyli ja może wysyłać żądania do/reszta/użytkowników. Jednak jeśli mogę zmienić mapowanie web.xml do:

<servlet-mapping> 
    <servlet-name>rest-servlet</servlet-name> 
    <url-pattern>/rest/*</url-pattern> 
</servlet-mapping> 

pojawia się błąd MVC:

WARN servlet.PageNotFound: No mapping found for HTTP request with URI [/rest/users] in DispatcherServlet with name 'rest-servlet'.

Wydaje się naprawdę dziwne, ponieważ błąd wskazuje, że żądanie jest mapowane do dyspozytora-servlet , ale jedyną rzeczą, która się zmieniła jest mapowanie serwletów.

Czy ktoś jeszcze to napotkał?

Odpowiedz

16

Serwlet Dispatchera jest głównym serwletem Spring MVC. Obsługuje wszystkie żądania, przychodzące do aplikacji, a za pomocą własnego silnika routingu wysyła go do kontrolerów. Jeśli go zmienić na

<url-pattern>/rest/*</url-pattern> 

Wtedy twoje żądanie powinno być jak ten rest/rest/users

Wspólny wzór - zezwolić na wysyłkę serwletu obsługiwać wszystkie żądania przychodzące (pierwsza konfiguracja jest poprawna)

+0

Dzięki Anton, jedynym Problemem jest to, że mam inne serwlety zdefiniowane obok servletu dyspozytora MVC (rzeczy GWT itp.), więc nie chcę przez to wszystko przekierowywać. Chyba będę musiał spojrzeć na niektóre opcje przepisywania adresu URL. –

+1

Możesz zdefiniować pęczek w deklaracji serwletu. W twoim scenariuszu możesz mapować Spring MVC do/rest a twój kontroler do/users – Anton

+0

Mam to ... teraz ma to sens, dzięki za pomoc –

Powiązane problemy