Spring MVC 不能正常获取参数的值
最近在开发时遇到一个非常奇怪的问题,在tomcat8中使用Spring MVC框架,在Controller中的方法参数无法正常获取到相应的值,将tomcat版本换成7.0就解决了。
记录以下解决过程,先上图:
项目采用ssm架构,在这里获取不到参数password的值,在网上查询相关资料,得到以下几种解决办法,但都没有什么效果:
1.使用@RequestParam注解
给password参数加上了RequestParam注解后,调试依然无法获取到password的值,将required的值改为true,直接报错了,错误的意思就是缺少password参数,可是明明传了参数的啊,为什么还说缺少参数呢,难道是没能够识别到我传的参数?这时候考虑到可能是传参方式的问题。更改了一下传参方式,将password的值附加到url后面,就像GET请求那样传参。果然是这个原因,参数的值能够接收到了。不过使用这种传参方式,不加RequestParam注解也能够接收到参数的值。虽然这种方法能够接收接收到参数的值了,但我无法忍受POST的这种传参方式,于是接着寻找下一个方法
2.使用@RequestBody注解
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注解的参数的类型
按照这种方式修改好了代码,再次重启tomcat,使用Postman调用,然后再次报了一个异常:
org.springframework.web.HttpMediaTypeNotSupportedException: Content type 'application/x-www-form-urlencoded' not supported
异常的大概意思就是不支持content type为application/x-www-form-urlencoded这种类型,一般通过表单提交的数据默认就是这种类型,猜测可能是RequestBody注解的原因,于是又换了一种传参方式:使用JSON格式传递数据
使用这种传参方式,果然能够接收到参数的值了,不过接收参数的方式和传参方式都变得复杂了。这个项目是我从公司拷回家继续写的,在公司的时候调试一切正常,回家就不行了,百思不得其解,同样的代码,改都没改过,为什么回到家就出问题了呢?既然代码都是一样的,运行结果不一样,那就只能说明运行的环境发生了改变。那么到底是哪里的环境不一样呢?出了这种问题,首先考虑数据库的结构,不过家里电脑数据库版本和公司电脑是一致的,而且数据都是从公司直接拷回来的,所以直接排除数据库的原因,更何况这是在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版本的原因?这感觉也太坑了吧。。。。看来盲目的追求高版本并不是一件好事
Spring MVC 不能正常获取参数的值的更多相关文章
- spring aop 利用JoinPoint获取参数的值和方法名称
AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...
- 菜鸟学习Spring——60s利用JoinPoint获取参数的值和方法名称
一.概述 AOP的实现方法在上两篇博客中已经用了两种方法来实现现在的问题来了虽然我们利用AOP,那么客户端如何信息传递?利用JoinPoint接口来实现客户端给具体实现类的传递参数. 二.代码演示. ...
- spring mvc controller中获取request head内容
spring mvc controller中获取request head内容: @RequestMapping("/{mlid}/{ptn}/{name}") public Str ...
- Spring MVC 保存并获取属性参数
在开发控制器的时候,有时也需要保存对应的数据到这些对象中去,或者从中获取数据.而Spring MVC给予了支持,它的主要注解有3个:@RequestAttribute.@SessionAttribut ...
- spring mvc 如何传递集合参数(list,数组)
spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...
- Spring MVC之Action输入参数
第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ...
- Spring MVC 接受的请求参数
目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...
- Spring MVC(七)--传递JSON参数
有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...
- Spring MVC 接收Json格式参数
今天做了一个关于表格排序的功能,可以通过右边的箭头做排序操作,每次操作需要通过Ajax将每条记录的Id数组作为参数去发送请求, 后台Spring MVC接到参数后作更改序号操作. 前端页面发送请求的代 ...
随机推荐
- (C#)找的winform窗体自适应类
原文:https://www.cnblogs.com/gguozhenqian/p/4288451.html 需要添加引用System.Windows.Forms public class AutoS ...
- c++中的一些计算的问题
要实现小数的四舍五入, float a = 3.456; //保留到小数点后两位 float b =(int)((a * 100) + 0.5) / 100.0; 但是这样对负数不好使, 对负数的话, ...
- 浏览器环境下JavaScript脚本加载与执行探析之代码执行顺序
本文主要基于向HTML页面引入JavaScript的几种方式,分析HTML中JavaScript脚本的执行顺序问题 1. 关于JavaScript脚本执行的阻塞性 JavaScript在浏览器中被解析 ...
- webpack安装整理
早上有点时间大概安装一下webpack,操作一下顺便把步骤记一下,乱乱的,还是记录一下吧! webpack安装步骤:1. 2. 3.一直回车,出现如下图: 4.创建src和dist文件 5.需要在np ...
- Mysql root账号general_log_file方法获取webshell
在前面的phpmyadmin漏洞利用专题中介绍了如何通过root账号来获取webshell,但在现实情况中,由于Mysql版本较高以及配置文件的缘故,往往无法直接通过root账号写入网站真实路劲下获取 ...
- C#6.0语言规范(十四) 枚举
一个枚举类型是一个独特的值类型(值类型)声明一组命名的常量. 这个例子 enum Color { Red, Green, Blue } 声明了一个名为枚举类型Color与成员Red,Green和Blu ...
- Vue + Bootstrap 制作炫酷个人简历(二)
没想到隔了这么久才来更新. 用vue做简历,不是非常适合,为什么呢. 因为简历没什么数据上的操作,一般都是静态的内容. 不过都说了用Vue来做,也只能强行续命了. 这里是我做好的成品 非一般简历 由 ...
- vue路由router的三种传参方式
方法三: 传参页面传递参数方式: this.$router.push({ path: 'indexTwoDetails', query: { "id": id } }) 接受参数页 ...
- 从官网下载指定版本的JDK
从官网下载指定版本的JDK 一.百度搜索jdk,进入最新版Downloads界面 百度搜索jdk,或者jdk下载,点击进入jdk官网最新版本下载界面,可以看到当前最新版本为jdk12 二.找到JDK历 ...
- 2. GitHub远程仓库
1. GitHub ssh-keygen -t rsa -C "youremail@example.com" 之后再用户主目录里会有隐藏的.ssh目录,里面有id_r ...