2017-08-01 131 views
3

嗨,我是Spring MVC的新手,嘗試一些簡單的例子。Spring mvc @PathVariable給出'客戶端發送的請求在語法上不正確。'

我在eclipse中使用archtype'spring-mvc-archtype'創建了一個新的Spring mvc maven項目。

我想打一個網址,並訪問使用@PathParam的PathVariables在地圖 <字符串,字符串>

這裏是我的控制器類

@Controller 
@RequestMapping(value="/greet") 
public class HomeController { 

@RequestMapping(value="/welcome/{countryName}/{userName}") 
public ModelAndView test(@PathVariable("userName") String userName, @PathVariable("countryName") String countryName) throws IOException{ 
    ModelAndView mav = new ModelAndView("home"); 
    mav.addObject("mymessage", "Welcome To "+countryName+" , Spring MVC - "+userName); 
    return mav; 
} 

@RequestMapping(value="/hi/{cn}/{un}") 
public ModelAndView hi(@PathVariable Map<String, String> pathVars){ 

    String countryName = pathVars.get("cn"); 
    String userName = pathVars.get("un"); 

    ModelAndView mav = new ModelAndView("home"); 
    mav.addObject("mymessage", "Hi "+userName+" in "+ countryName); 
    return mav; 
} 
} 

這裏是配置類

@Configuration 
@EnableWebMvc 
@ComponentScan(basePackages="org.gyanbang.kiran.SpringMvc") 
public class MvcConfiguration extends WebMvcConfigurerAdapter{ 

@Bean 
public ViewResolver getViewResolver(){ 
    InternalResourceViewResolver resolver = new InternalResourceViewResolver(); 
    resolver.setPrefix("/WEB-INF/views/"); 
    resolver.setSuffix(".jsp"); 
    return resolver; 
} 

@Override 
public void addResourceHandlers(ResourceHandlerRegistry registry) { 
    registry.addResourceHandler("/resources/**").addResourceLocations("/resources/"); 
} 
} 

所以當我運行這個,並打 http://localhost:8080/SpringMvc/greet/welcome/India/user1它工作正常,我得到期望的結果。

但是在http://localhost:8080/SpringMvc/greet/hi/India/user1它給出了400錯誤消息 '客戶端發送的請求在語法上是不正確的。'

我已經嘗試了幾個選項,也嘗試將spring-webmvc版本更改爲4.1.6.RELEASE,但它在這種情況下給了我404。

任何幫助將是偉大的。 在此先感謝。

+0

是否有一個特定的原因,你想變量作爲地圖? – geoffreydv

+0

@geoffreydv沒有具體的原因,但我想嘗試一下,看看它是如何工作的。另外我覺得它很容易作爲一個概念和實現路徑變量的方式。謝謝 –

+0

解決了它:好像我需要將4.3.9.RELEASE和spring-webmvc的spring-context和spring-test工件版本更新爲4.1.6.RELEASE。 更新版本後,它與上面的書面代碼工作正常。 謝謝。 :-) –

回答

1

@PathVariable可以使用Map<String,String>,您需要使用<mvc:annotation-driven/>轉換爲ApplicationContaxt.xml。你可以找到下面的代碼:

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

<mvc:annotation-driven/> 
1

從一開始,我真的想知道爲什麼你的解決方案無法正常工作。

我已檢查收集到地圖中的路徑變量 - 它們正常工作。我認爲你的問題是使用調度程序servlet。您可以嘗試配置一個或搜索一些現有的解決方案,我建議使用彈簧盒的解決方案。

請檢查我的解決方案上的g​​it。在build.gradle文件

dependencies { 
    classpath("org.springframework.boot:spring-boot-gradle-plugin:${springBootVersion}") 
} 

注意...

dependencies { 
    compile("org.springframework.boot:spring-boot-starter-thymeleaf") 
    runtime('org.springframework.boot:spring-boot-devtools') 
} 

Link to my git project solution

還有就是你的代碼的幾排,所以應該明確你。但如果有什麼不明確的地方 - 請不要猶豫,並發表評論。

相關問題