2015-01-15 177 views
1

我只是一個新手到春天MVC下面是我的代碼,當我嘗試去bye我獲得以下錯誤找不到@PathVariable [pathVars]在@RequestMapping Spring MVC的

Could not find @PathVariable [pathVars] in @RequestMapping Spring MVC 

以下是我的代碼

package com.springapp.mvc; 

import org.springframework.stereotype.Controller; 
import org.springframework.ui.ModelMap; 
import org.springframework.web.bind.annotation.PathVariable; 
import org.springframework.web.bind.annotation.RequestMapping; 
import org.springframework.web.bind.annotation.RequestMethod; 
import org.springframework.web.servlet.ModelAndView; 

import java.util.Map; 

@Controller 
public class HelloController { 
    @RequestMapping("/") 
    public String printWelcome(ModelMap model) { 
     model.addAttribute("message", "Hello world!"); 
     return "hello"; 
    } 
    @RequestMapping("/runThis/{bye}/{hye}") 
    public ModelAndView printBye(@PathVariable Map<String,String> pathVars) { 
     String Bye = pathVars.get("bye"); 
     String Hye = pathVars.get("hye"); 
     ModelAndView modelAndView = new ModelAndView(); 
     modelAndView.addObject("message", "you are"+Bye+ "AND Here COmes" +Hye+"!"); 
     return modelAndView; 
    } 
} 

EDIT Full Stack。

type Exception report 

message Request processing failed; nested exception is org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public org.springframework.web.servlet.ModelAndView com.springapp.mvc.HelloController.printBye(java.util.Map)]; nested exception is java.lang.IllegalStateException: Could not find @PathVariable [pathVars] in @RequestMapping 

description The server encountered an internal error that prevented it from fulfilling this request. 

exception 

org.springframework.web.util.NestedServletException: Request processing failed; nested exception is org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public org.springframework.web.servlet.ModelAndView com.springapp.mvc.HelloController.printBye(java.util.Map)]; nested exception is java.lang.IllegalStateException: Could not find @PathVariable [pathVars] in @RequestMapping 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:978) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 

root cause 

org.springframework.web.bind.annotation.support.HandlerMethodInvocationException: Failed to invoke handler method [public org.springframework.web.servlet.ModelAndView com.springapp.mvc.HelloController.printBye(java.util.Map)]; nested exception is java.lang.IllegalStateException: Could not find @PathVariable [pathVars] in @RequestMapping 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:180) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 

root cause 

java.lang.IllegalStateException: Could not find @PathVariable [pathVars] in @RequestMapping 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter$ServletHandlerMethodInvoker.resolvePathVariable(AnnotationMethodHandlerAdapter.java:859) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolvePathVariable(HandlerMethodInvoker.java:710) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.resolveHandlerArguments(HandlerMethodInvoker.java:359) 
    org.springframework.web.bind.annotation.support.HandlerMethodInvoker.invokeHandlerMethod(HandlerMethodInvoker.java:170) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.invokeHandlerMethod(AnnotationMethodHandlerAdapter.java:446) 
    org.springframework.web.servlet.mvc.annotation.AnnotationMethodHandlerAdapter.handle(AnnotationMethodHandlerAdapter.java:434) 
    org.springframework.web.servlet.DispatcherServlet.doDispatch(DispatcherServlet.java:943) 
    org.springframework.web.servlet.DispatcherServlet.doService(DispatcherServlet.java:877) 
    org.springframework.web.servlet.FrameworkServlet.processRequest(FrameworkServlet.java:966) 
    org.springframework.web.servlet.FrameworkServlet.doGet(FrameworkServlet.java:857) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:617) 
    org.springframework.web.servlet.FrameworkServlet.service(FrameworkServlet.java:842) 
    javax.servlet.http.HttpServlet.service(HttpServlet.java:723) 

note The full stack trace of the root cause is available in the Apache Tomcat/6.0.43 logs. 
+2

您認爲'@ PathVariable'的作用是什麼? – 2015-01-15 18:39:20

+0

我假設路徑變量用於將請求映射到受尊重的Action。我知道我的'pathVars'目前是空的,但即使我爲他們製作了一些映射器,我仍然得到相同的錯誤。 – 2015-01-15 18:41:53

+1

不要假設。閱讀[documentation](http://docs.spring.io/spring-framework/docs/current/javadoc-api/org/springframework/web/bind/annotation/PathVariable.html)。 – 2015-01-15 18:42:47

回答

0

當您的請求映射你表明你的URL有一個固定部分/runThis/和兩個可變部分{bye}{hye}以及你希望他們被映射到你的方法的兩個參數(如你不匹配的名字並不表示其他事情)。

但是在你的方法中,你聲明瞭一個名爲pathVars的參數。所以你的參數名稱,類型和數量不匹配。這就是Spring MVC抱怨的。

所以,你想要的是:

@RequestMapping("/runThis/{bye}/{hye}") 
public ModelAndView printBye(@PathVariable String bye, @PathVariable String hye) { 
    ModelAndView modelAndView = new ModelAndView(); 
    modelAndView.addObject("message", "you are" + bye + "AND Here COmes" + hye + "!"); 
    return modelAndView; 
} 

它比你的代碼更簡單,更類型安全。並請閱讀文檔。這是一個非常基本的例子。

+1

如果方法參數是Map 或MultiValueMap ,那麼地圖會填充所有路徑變量名稱和值._ – 2015-01-15 18:55:21

+0

感謝快速響應隊友,我是一個新手,我想問的是,我正在看一個教程,說。 '@PathVariable Map pathVars'可以處理參數化的URI請求。所以我想你錯過了我想要達到的目標。 – 2015-01-15 18:56:41

+0

@SotiriosDelimanolis我知道你可以爲地圖分配請求參數和HTTP標頭。它是否也適用於路徑變量?你有沒有參考文檔? – Codo 2015-01-15 19:49:47

7

您在調度員servlet配置XML

或在春季使用

@EnableWebMvc標註在Spring配置類

更高版本需要<mvc:annotation-driven/>並請理解@EnableWebMvc由更換mvc:註釋驅動

並確保您的xmlns正確

<beans xmlns="http://www.springframework.org/schema/beans" 
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
xmlns:mvc="http://www.springframework.org/schema/mvc" 
xmlns:tx="http://www.springframework.org/schema/tx" 
xmlns:context="http://www.springframework.org/schema/context" 
xsi:schemaLocation="http://www.springframework.org/schema/mvc http://www.springframework.org/schema/mvc/spring-mvc-3.1.xsd 
        http://www.springframework.org/schema/tx http://www.springframework.org/schema/tx/spring-tx-3.1.xsd  
        http://www.springframework.org/schema/beans http://www.springframework.org/schema/beans/spring-beans-3.1.xsd 
        http://www.springframework.org/schema/context http://www.springframework.org/schema/context/spring-context-3.1.xsd"> 
0
在某些情況下

如果jspPageName在ModelAndView中(jspPageName)語句

指向不存在的頁面,你會得到同樣的錯誤

注意到我使用Spring MVC的4.2.4和JDK 8

1

取而代之的是在你的代碼:

public ModelAndView printBye(@PathVariable Map<String,String> pathVars) { 

它改成這樣:

public ModelAndView printBye(@RequestParam Map<String,String> pathVars) { 

這是因爲@RequestParam用於處理傳入參數的Map對象,而@PathVariable用於處理傳遞給參數的單個項目。以下是@PathVariable的示例:

public ModelAndView printBye(@PathVariable("bye") String Bye, @PathVariable("hye") String Hye) { 
相關問題