MVC 接收不到参数? —— 看我如何给你安排得明明白白

news/2024/11/29 12:41:54/

文章结构

    • 问题背景:
    • 问题处理
    • 总结

问题背景:

现有如下代码:

@PostMapping(value = "/payment/create")
@ResponseBody
public CommonResult create(Payment payment) {}

乍眼看去是不是很好,至少没啥问题很自然,像大自然一样自然,但是确实是有问题的

问题现象:通过 postman 发送 post 请求,payment 能收到参数;而通过分布式远程调用却接收不到参数,这是为什么呢

问题处理

思路:先看看参数有没有发送过来,其次看看是不是处理参数失败了

1、首先在 DispatcherServlet 类的 doDispatch 方法上打了一个断点,用 Idea 的 debug 窗口执行如下命令:

// 查看 post 请求中 body 数据的
new String(((Http11InputBuffer) ((RequestFacade) request).request.coyoteRequest.inputBuffer).byteBuffer.hb)

很简单读者自行操作一下:查看请求 body 的数据,确认下请求中有没有携带参数

通过查看 http 请求的 body,发现参数数据是有的,也就是说参数有但没有解析到变量 payment 中。问题自然出现在参数解析器上面。继续

2、调查发现postman发送的请求类型是 multipart/form-data 类型,也就是表单提交类型,这种类型一般发生在前端直接提交请求到后台,而分布式调用一般是 contextType=application/json 类型

背景知识:参数解析器(HandlerMethodArgumentResolver)是有顺序的,不同的参数解析器能解析的参数不一样

3、到这里问题大致是定位到了,需要设置正确的contentType类型,接下来就是验证流程

代码写的不对,我们代码针对的是表单形式的 contentType 而分布式环境下发送的是 JSON 形式的 contentType

4、修改代码如下:添加 @RequestBody 注解!!!

@PostMapping(value = "/payment/create")
@ResponseBody
public CommonResult create(@RequestBody Payment payment) {}

5、参数 payment 成功接收到请求数据

总结

总结:分布式环境下,默认都把 @RequestBody@ResponseBody 注解加上,不给自己找麻烦!!!

传送门: 保姆式Spring5源码解析

欢迎与作者一起交流技术和工作生活

联系作者


http://www.ppmy.cn/news/109653.html

相关文章

何时加索引,性别字段和逻辑删除字段应不应该加

首先哪些地方加索引(按照sql执行顺序写) 1、from表扫描连接处索引 2、where后条件去走索引 3、group by加索引 4、select查询不用加 5、order by排序加索引 (对于第四点,覆盖索引:查询的字段都被索引覆盖,…

Kotlin笔记(一)常量与变量

文章目录 1、常量与变量定义NULL检查机制?. 判空辅助?: 判空辅助!! 非空断言 类型检测与类型转换is 类型检测as 类型转换 2、基本数据类型数字比较 类型转换 toDouble()位操作符字符数组字符串 String""" 字符串字面值${} 字符串模板 lateinit 延迟初始化by l…

linux条件变量知识点总结

与条件变量相关API 条件变量是线程另一可用的同步机制。条件变量给多个线程提供了一个会合的场所。条件变量与互斥量一起使用时,允许线程以无竞争的方式等待特定的条件发生。 条件本身是由互斥量保护的。线程在改变条件状态前必须首先锁住互斥量,其他线程…

高速缓存(cache)的原理: 了解计算机架构与性能优化

计基之存储器层次结构 Author: Once Day Date: 2023年5月9日 长路漫漫,而今才刚刚启程! 本内容收集整理于《深入理解计算机系统》一书。 参看文档: 捋一捋Cache - 知乎 (zhihu.com)iCache和dCache一致性 - 知乎 (zhihu.com)C…

使用SolidJS+SpringBoot写一个简单的个人博客

首发于Enaium的个人博客 前言 前端我们使用了SolidJS来进行开发,它是一个新出的前端框架,它的特点是使用React Hooks的方式来进行开发,并且它的API和React的API非常相似,所以如果你会React的话,那么你就会SolidJS. 后端我们使用了SpringBoot来进行开发,数据库我们使用了MySQL…

IMX6ULL裸机篇之I2C相关寄存器

一. I2C实验 I2C时钟选择与传输速率 1. IMX6ULL的 I2C频率标准模式 100kbit/S,快速模式为 400Kbit/S 2. 时钟源选择 perclk_clk_rootipg_clk_root66MHz(由之前的时钟实验章节可以知道是 66MHz)。 二. I2C 寄存器配置 I2Cx_IFDR寄存器&…

考研C语言第七章

7.2函数的声明定义,函数的分类和调用 1、函数声明要在main函数上面,这样main函数才可以进行调用 第一节课主要就学了函数的调用,项目在开发的时候分工用的比较多 主要结构: func.c里面进行函数的定义 不是很重要,进…

VUE3浅析---响应式

VUE3中setup语法糖解决响应式的方案,所有的只要被ref或者reactive包裹的变量,都会转变成响应式。而在VUE2中,要想做成响应式,必须将变量定义在data函数中。 文章目录 1、ref:将一个属性或者对象定义成ref对象&#xff…