最近在开发时遇到一个非常奇怪的问题,在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. 一不小心发现了个Asp.Net Bug

    1. Ver是页面定义的变量 2. asp.net 页面定义为  <link href="/company/them/page.css?v=<%=Ver%>" r ...

  2. openvSwitch tunnel

    ovs tunnel 实验拓扑 实验拓扑搭建基础脚本 #vbox虚拟机1 ip netns add left ip link add name veth1 type veth peer name sw ...

  3. psutil 跨平台根据程序名杀进程

    笔者在项目中遇到过需要根据进程名杀进程的需求,利用python库psutil实现了此功能. 模块地址: https://pypi.python.org/pypi/psutil/   psutil功能 ...

  4. 57.storm拓扑结构调整

    几个概念 Topology(拓扑):Spout.Bolt组成的一个完整的流程结构: Stream Grouping:流分组.数据的分发方式: Spout:直译 水龙头,也就是 消息源 的意思: Bol ...

  5. 关于Python2和Python3之间的文本模型改变

    原文地址:http://python-notes.curiousefficiency.org/en/latest/python3/questions_and_answers.html#what-act ...

  6. Web API 2 对于 Content-Length 要求严格

    最近在做一个工具,里面有一个发起http请求的操作,虽然工具不是用.NET写的,但是测试用服务器软件是.NET写的.在这里选择了ASP.NET MVC和Web API 2. 首先预定义Student与 ...

  7. Day.js - JavaScript时间处理库

    Day.js简介 在使用JavaScript处理时间方面,使用的时Moment.js,但是它太重了,有200多k,一般项目中可能也只是用了几个api而已,所以,这里推荐一个轻量的时间库 - Day.j ...

  8. Vue + Element UI 实现权限管理系统 前端篇(二):Vue + Element 案例

    导入项目 打开 Visual Studio Code,File --> add Folder to Workspace,导入我们的项目. 安装 Element 安装依赖 Element 是国内饿 ...

  9. JS中this的那些事儿

    this是JavaScript中最复杂的机制之一.它是一个很特别的关键字,被自动定义在所有函数的作用域中. 一.this到底指向什么? this既不指向函数自身,也不指向函数的词法作用域,具体指向什么 ...

  10. linux添加用户、修改密码

    1.在root下添加用户用 adduser 命令 # 添加用户 admin [root@flm] #sudo adduser admin 2.添加用户登录密码 # 为用户 admin 修改密码 [ro ...