2012-04-20 38 views
9

Tengo un extraño escenario en el que mi controlador no se invoca a menos que asigne el servlet del operador a/* en web.xml. He definido un controlador con una RequestMapping:Spring MVC @RequestMapping no funciona

@Controller 
public class UserController { 

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

Y un contexto de aplicación:

<?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" /> 

Por último, esta es mapeado en 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> 

esto funciona como se esperaba, es decir que puede hacer solicitudes a/descansar/usuarios. Sin embargo si cambio de la asignación a web.xml:

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

consigo un error MVC:

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

Parece muy extraño, porque el error indica que la solicitud se asigna al despachador-servlet , sin embargo, lo único que ha cambiado es el mapeo de servlets.

¿Alguien más ha encontrado esto?

Respuesta

16

servlet de dispatcher es el servlet principal de Spring MVC. Maneja todas las solicitudes, llegando a su aplicación, y usando su propio motor de enrutamiento lo envía a los Controladores. Si lo cambia a

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

Luego, su solicitud debe ser así rest/rest/users

El patrón común - permite servlet despacho para manejar todas las peticiones entrantes (primera configuración es válida)

+0

Gracias Anton, el único El problema que enfrento es que tengo otros servlets definidos junto con el servlet despachador de MVC (cosas de GWT, etc.), así que no quiero enrutar todo a través de él. Supongo que tendré que mirar algunas opciones de reescritura de URL –

+1

Puede definir un grupo de en la declaración de servlet. En su escenario, puede asignar Spring MVC a/rest y su controlador a/users – Anton

+0

Entendido ... tiene mucho sentido ahora, gracias por su ayuda –

Cuestiones relacionadas