最近在开发时遇到一个非常奇怪的问题,在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 不能正常获取参数的值的更多相关文章

  1. spring aop 利用JoinPoint获取参数的值和方法名称

    AspectJ使用org.aspectj.lang.JoinPoint接口表示目标类连接点对象,如果是环绕增强时,使用org.aspectj.lang.ProceedingJoinPoint表示连接点 ...

  2. 菜鸟学习Spring——60s利用JoinPoint获取参数的值和方法名称

    一.概述 AOP的实现方法在上两篇博客中已经用了两种方法来实现现在的问题来了虽然我们利用AOP,那么客户端如何信息传递?利用JoinPoint接口来实现客户端给具体实现类的传递参数. 二.代码演示. ...

  3. spring mvc controller中获取request head内容

    spring mvc controller中获取request head内容: @RequestMapping("/{mlid}/{ptn}/{name}") public Str ...

  4. Spring MVC 保存并获取属性参数

    在开发控制器的时候,有时也需要保存对应的数据到这些对象中去,或者从中获取数据.而Spring MVC给予了支持,它的主要注解有3个:@RequestAttribute.@SessionAttribut ...

  5. spring mvc 如何传递集合参数(list,数组)

    spring mvc 可以自动的帮你封装参数成为对象,不用自己手动的通过request一个一个的获取参数,但是这样自动的参数封装碰碰到了集合参数可能就需要点小技巧才可以了. 一.基础类型和引用类型有什 ...

  6. Spring MVC之Action输入参数

    第一部分:Action输入参数Spring MVC 通过@RequestMapping注解映射请求,最终的真正执行代码为处理器方法,即@RequestMapping注解的方法.Spring MVC方法 ...

  7. Spring MVC 接受的请求参数

    目录 1. 概述 2. 详解 2.1 处理查询参数 2.2 处理路径参数接受输入 2.3 处理表单 3. 补充内容 3.1 Ajax/JSON 输入 3.2 multipart参数 3.3 接收 he ...

  8. Spring MVC(七)--传递JSON参数

    有时候参数的传递还需要更多的参数,比如一个获取用户信息的请求中既有用户ID等基本参数,还要求对查询结果进行分页,针对这种场景,一般都会将分页参数封装成一个对象,然后将它和基本参数一起传给控制器,为了控 ...

  9. Spring MVC 接收Json格式参数

    今天做了一个关于表格排序的功能,可以通过右边的箭头做排序操作,每次操作需要通过Ajax将每条记录的Id数组作为参数去发送请求, 后台Spring MVC接到参数后作更改序号操作. 前端页面发送请求的代 ...

随机推荐

  1. Python 学习第三部分函数——第一章函数基础

    函数是python 为了代码最大程度的重用和最小代码冗余而提供的最基本的程序结构.使用它我们可以将复杂的系统分解为可管理的部件. 函数相关语句 def...          创建一个对象并将其赋值给 ...

  2. .net图表之ECharts随笔01-最简单的使用步骤

    找了几种绘制图表的办法,后面选定了ECharts.下载链接如下,好像不同的ECharts有不同的用法,要下对. https://gitee.com/Tuky/SomeWebFrame/tree/mas ...

  3. ASP.Net MVC OA项目笔记<三>

    1.1.1 业务层和数据层之间加一个数据会话层,封装所有数据操作类实例的创建(工厂类) 工厂类是负责对象的创建 作用:将BLL和DAL解耦了,提供一个数据访问的统一访问点 数据会话层DBSession ...

  4. UWP Background过渡动画

    首先说两件事: 1.大爆炸我还记着呢,先欠着吧... 2.博客搬家啦,新地址:https://blog.ultrabluefire.cn/ ==========下面是正文========== 前些日子 ...

  5. 【AWK】:常用总结

    单机文本数据处理,常用AWK,总结一下AWK最常用的要点,备忘备查. 1.What is AWK(1)Aho.Weinberger.Kernighan三位发明者名字首字母:(2)一个行文本处理工具: ...

  6. Shell - 简明Shell入门09 - 重定向(Redirection)

    示例脚本及注释 #!/bin/bash pwd > 1.log # 输出重定向到指定文件 date 1> 1.log # ">"与"1>" ...

  7. winform计算文本的所占的像素长度

    /// <summary> /// 计算文本的宽度 /// </summary> /// <param name="str"></para ...

  8. Dev Label显示不同颜色字体

    labelControl1.Text = "<size=14>Size = 14<br>" + "<b>Bold</b> ...

  9. python再探

    python是一门强大的高级编程语言,之前的文章中介绍了python的基础知识,接下来会介绍一些python更为高级的知识. 面向对象编程 基本知识 一般编程思想分为面向过程和面向对象,前者的基本单元 ...

  10. Python:使用异常处理来判断运行的平台

    try: import termios, TERMIOS 1 except ImportError: try: import msvcrt 2 except ImportError: try: fro ...