2011-01-14 15 views
7

Ci sono molte domande relative a questo errore su Stack   Overflow, e ho provato le soluzioni per quelle più pertinenti senza successo. Ecco il mio problemaSpring MVC - Nessuna mappatura trovata per richiesta URI

Sto tentando di mappare questa richiesta: /user/{userId} dove userId è una stringa. Sono in grado di gestire richieste GET a /user con la seguente classe annotata e la configurazione 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> 

Poi, quando ho richiedere /user

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

ora per fare qualcosa di interessante. Posso cambiare il mio codice al seguente:

@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>"; 
    } 
} 

Ho la temuta 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' 

Che cosa sto facendo di sbagliato?

risposta

9

In genere non si include il percorso del servlet effettivo a cui è mappato il servlet del dispatcher come parte del mapping delle richieste. La mappatura della richiesta è relativa al dispatcher. Nel primo caso degenerato, il dispatcher è abbastanza intelligente da capire cosa intendi, ma quando inizi ad aggiungere variabili di percorso che si interrompono. Dovresti essere in grado di accedere a /user/user/foo e ottenere quello che stai cercando, con la configurazione corrente.

+2

Questo risolto! Non sono chiaro su come funziona, tuttavia: requesting/user e/user/user danno entrambi userId = user. Perché? – purecharger

Problemi correlati