Java Spring mvc@PathVariable提供';客户端发送的请求在语法上不正确;
大家好,我是SpringMVC新手,正在尝试一些简单的例子 我已经在eclipse中使用archtype“SpringMVCArchType”创建了一个新的SpringMVCMaven项目 我试图点击一个url并在地图中使用@PathParam访问PathVariablesJava 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
@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')
}