Java Spring mvc@PathVariable提供';客户端发送的请求在语法上不正确;

Java Spring mvc@PathVariable提供';客户端发送的请求在语法上不正确;,java,spring,maven,spring-mvc,path-variables,Java,Spring,Maven,Spring Mvc,Path Variables,大家好,我是SpringMVC新手,正在尝试一些简单的例子 我已经在eclipse中使用archtype“SpringMVCArchType”创建了一个新的SpringMVCMaven项目 我试图点击一个url并在地图中使用@PathParam访问PathVariables 这是我的控制器类 @Controller @RequestMapping(value="/greet") public class HomeController { @RequestMapping(value="/wel

大家好,我是SpringMVC新手,正在尝试一些简单的例子

我已经在eclipse中使用archtype“SpringMVCArchType”创建了一个新的SpringMVCMaven项目

我试图点击一个url并在地图中使用@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;
}
}
所以当我运行这个并点击 它工作得很好,我得到了想要的结果

但在它上面给出了一个400错误的消息 “客户端发送的请求在语法上不正确。

我尝试了几个选项,也尝试了将SpringWebMVC版本改为4.1.6.RELEASE,但在这种情况下,它给了我404

任何帮助都会很好。
提前感谢。

根据Spring文档:

@PathVariable参数可以是任何简单类型,如int、long、Date等

(尽管这种行为可能会发生)

此外,控制器使用两个参数指定URI:

@RequestMapping(value="/hi/{cn}/{un}")
但是控制器方法只声明一个:
@PathVariable映射pathVars

如果您的目标是(如本文所示:“尝试一些简单的示例”)使用Spring MVC来证明一些前后调用,那么您可能应该首先保持简单,例如:

@RequestMapping(value="/hi/{cn}/{un}")
public ModelAndView hi(@PathVariable String cn, @PathVariable String un){
    ...
}

@PathVariable
可以使用
Map
,您需要使用
进入
applicationcontext.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/>

从一开始我就很想知道为什么您的解决方案不起作用

我已经检查了收集到地图中的路径变量——它们工作正常。我想你的问题是调度器servlet。您可以尝试配置一个或搜索一些现有的解决方案,我建议使用SpringBox中的解决方案

请在git上检查我的解决方案。注意
build.gradle
文件

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


代码中只有很少一行,所以您应该很清楚。但是,如果有什么不清楚的地方,请不要犹豫,在评论中询问。

您希望将变量作为映射的具体原因是什么?@geoffreydv没有具体原因,但我想尝试一下,看看它是如何工作的。此外,我发现它作为一个概念和实现路径变量的方法很容易。感谢您解决了这个问题:看来我需要将spring上下文和spring测试工件版本更新为4.3.9.RELEASE,将spring webmvc更新为4.1.6.RELEASE。更新版本后,它可以很好地使用上述编写的代码。谢谢。:-)请看这里:感谢您宝贵的回复。但我已经定义了
@RequestMapping(value=“/welcome/{countryName}/{userName}”)公共模型和视图测试(@PathVariable(“userName”)字符串userName,@PathVariable(“countryName”)字符串countryName)抛出IOException{
在控制器中,但我想尝试这种特定情况。好的,如果您想尝试使用PathVariable传递映射,那么您需要了解Spring是如何支持它的。我在上面的答案中发布了一个链接。但是,无论您是否传递映射,如果您的控制器方法接受一个PathVariable和您的RequestMapping声明两个参数占位符,然后您将得到一个异常。您在问题中发布的异常的根本原因是:(a)使用映射而不告诉Spring如何处理映射;(b)删除两个参数占位符,但只定义一个PathVariable。
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')
}