欢迎您访问程序员文章站本站旨在为大家提供分享程序员计算机编程知识!
您现在的位置是: 首页  >  IT编程

Spring MVC 不能正常获取参数的值

程序员文章站 2022-06-18 08:45:16
最近在开发时遇到一个非常奇怪的问题,在tomcat8中使用Spring MVC框架,在Controller中的方法参数无法正常获取到相应的值,将tomcat版本换成7.0就解决了。 记录以下解决过程,先上图: 项目采用ssm架构,在这里获取不到参数password的值,在网上查询相关资料,得到以下几 ......

最近在开发时遇到一个非常奇怪的问题,在tomcat8中使用spring mvc框架,在controller中的方法参数无法正常获取到相应的值,将tomcat版本换成7.0就解决了。

记录以下解决过程,先上图:

Spring MVC 不能正常获取参数的值

Spring MVC 不能正常获取参数的值

 

项目采用ssm架构,在这里获取不到参数password的值,在网上查询相关资料,得到以下几种解决办法,但都没有什么效果:

1.使用@requestparam注解

  给password参数加上了requestparam注解后,调试依然无法获取到password的值,将required的值改为true,直接报错了,错误的意思就是缺少password参数,可是明明传了参数的啊,为什么还说缺少参数呢,难道是没能够识别到我传的参数?这时候考虑到可能是传参方式的问题。更改了一下传参方式,将password的值附加到url后面,就像get请求那样传参。果然是这个原因,参数的值能够接收到了。不过使用这种传参方式,不加requestparam注解也能够接收到参数的值。虽然这种方法能够接收接收到参数的值了,但我无法忍受post的这种传参方式,于是接着寻找下一个方法

 Spring MVC 不能正常获取参数的值

2.使用@requestbody注解

Spring MVC 不能正常获取参数的值

  requestbody看字面意思就是请求的body,我在请求的时候确实是将参数放到body里面传递过去的,看到这个注解感觉貌似看到了希望一样,于是迫不及待的重启tomcat,然后用postman调用,这次直接断点都不进了,直接报了一个异常:

org.springframework.http.converter.httpmessagenotreadableexception: required request body is missing: public boolean com.scdq.manager.controller.systemcontroller.login(java.lang.string)

异常的大概意思就是缺少必要的请求body,通过查询相关资料,发现requestbody并不能这么用,需用创建一个类,在类中定义相关的参数,然后再将这个类作为requestbody注解的参数的类型

Spring MVC 不能正常获取参数的值

按照这种方式修改好了代码,再次重启tomcat,使用postman调用,然后再次报了一个异常:

org.springframework.web.httpmediatypenotsupportedexception: content type 'application/x-www-form-urlencoded' not supported

 异常的大概意思就是不支持content type为application/x-www-form-urlencoded这种类型,一般通过表单提交的数据默认就是这种类型,猜测可能是requestbody注解的原因,于是又换了一种传参方式:使用json格式传递数据

Spring MVC 不能正常获取参数的值

Spring MVC 不能正常获取参数的值

使用这种传参方式,果然能够接收到参数的值了,不过接收参数的方式和传参方式都变得复杂了。这个项目是我从公司拷回家继续写的,在公司的时候调试一切正常,回家就不行了,百思不得其解,同样的代码,改都没改过,为什么回到家就出问题了呢?既然代码都是一样的,运行结果不一样,那就只能说明运行的环境发生了改变。那么到底是哪里的环境不一样呢?出了这种问题,首先考虑数据库的结构,不过家里电脑数据库版本和公司电脑是一致的,而且数据都是从公司直接拷回来的,所以直接排除数据库的原因,更何况这是在controller中接收不到参数,还没有到访问数据库的那一步,就更不可能与数据库有关系了,所以直接排除数据库的原因。由于项目是由maven构建的,相关的jar包都是maven自动去下载的,于是怀疑会不会是maven自动下载下来的jar包有问题,然后把本地仓库的jar包全部删除,让maven从新去下载,就这样重复了几次,问题依然存在,不得已只好暂时排除maven的原因。最后实在想不到其他的原因了,便开始怀疑tomcat的原因,公司tomcat是7.0版本的,家里的tomcat是8.0版本的,虽然两个tomcat版本不一致,不过并没有下意识就觉得一定是tomcat版本的原因,毕竟潜意识里认为8.0一定是7.0之后功能的升级。虽然这样想,但还是抱着死马当活马医的心态去测试,在tomcat官网下载7.0版本的压缩包,然后配好相应的环境,用postman调用,结果就是这么意外,参数值获取到了?!!! 还真是tomcat版本的原因?这感觉也太坑了吧。。。。看来盲目的追求高版本并不是一件好事