2011-01-14 13 views
7

Hay muchas preguntas relacionadas con este error en Stack   Overflow, y he intentado las soluciones a las más pertinentes sin éxito. Aquí está mi problema.Spring MVC - No se encontró un mapeo para URI de solicitud

Estoy intentando hacer el mapa de esta solicitud: /user/{userId} donde userId es un String. Soy capaz de manejar las peticiones GET a /user con la siguiente clase anotada y configuración Spring:

UserController.java

@Controller 
@RequestMapping("/user") 
public class UserController { 
    private static final Logger log = Logger.getLogger(UserController.class.getName()); 

    @RequestMapping(method=RequestMethod.GET) 
    public @ResponseBody String info() { 
     log.debug("mapping succeeded!"); 
     return "<H1>foo</H1>"; 
    } 
} 

web/WEB-INF/user-servlet.xml

<?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:p="http://www.springframework.org/schema/p" 
    xmlns:context="http://www.springframework.org/schema/context" 
    xsi:schemaLocation=" 
     http://www.springframework.org/schema/beans 
     http://www.springframework.org/schema/beans/spring-beans-3.0.xsd 
     http://www.springframework.org/schema/context 
     http://www.springframework.org/schema/context/spring-context-3.0.xsd"> 

    <context:component-scan base-package="com.example"/> 
</beans> 

web.xml

<servlet> 
    <servlet-name>user</servlet-name> 
    <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class> 
    <load-on-startup>1</load-on-startup> 
</servlet> 
<servlet-mapping> 
    <servlet-name>user</servlet-name> 
    <url-pattern>/user/*</url-pattern> 
</servlet-mapping> 

Luego, cuando solicito /user

2011-01-14 15:47:41,942 DEBUG [com.example.rest.UserController] (http-11080-1) mapping succeeded! 

Ahora hacer algo interesante. Puedo cambiar mi código a la siguiente:

@Controller 
@RequestMapping("/user") 
public class UserController { 
    private static final Logger log = Logger.getLogger(UserController.class.getName()); 

    @RequestMapping(value="/{userId}", method=RequestMethod.GET) 
    public @ResponseBody String info(@PathVariable String userId) { 
     log.debug("mapping succeeded! userId=" + userId); 
     return "<H1>foo</H1>"; 
    } 
} 

que tienen la temida No mapping found...

(main) Pre-instantiating singletons in  org.s[email protected]36598d00: defining beans  [userController,org.springframework.context.annotation.internalConfigurationAnnotationProcessor,org.springframework.context.annotation.internalAutowiredAnnotationProcessor,org.springframework.context.annotation.internalRequiredAnnotationProcessor,org.springframework.context.annotation.internalCommonAnnotationProcessor]; root of factory hierarchy 
(main) instantiating UserController 
(main) Mapped URL path [/user/*] onto handler 'userController' 
(main) Mapped URL path [/user/*.*] onto handler 'userController' 
(main) Mapped URL path [/user/*/] onto handler 'userController' 

... 

(http-11080-1) No mapping found for HTTP request with URI [/user] in DispatcherServlet with name 'user' 
(http-11080-1) No mapping found for HTTP request with URI [/user/foo] in DispatcherServlet with name 'user' 
(http-11080-1) No mapping found for HTTP request with URI [/user/] in DispatcherServlet with name 'user' 

¿Qué estoy haciendo mal?

Respuesta

9

No suele incluir la ruta de acceso de servlet real a la que está asignado su servlet de operador como parte de su asignación de solicitud. El mapeo de solicitud es relativo al despachador. En el primer caso degenerado, el despachador es lo suficientemente inteligente como para entender lo que quería decir, pero cuando comienza a agregar variables de ruta que se descomponen. Debería poder acceder al /user/user/foo y obtener lo que está buscando, con su configuración actual.

+2

Esto lo resolvió! Sin embargo, no tengo claro cómo funciona esto: requesting/user y/user/user dan como resultado el userId = usuario. ¿Por qué? – purecharger

Cuestiones relacionadas