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

文章结构

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

问题背景:

现有如下代码:

@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://xiahunao.cn/news/254269.html

如若内容造成侵权/违法违规/事实不符,请联系瞎胡闹网进行投诉反馈,一经查实,立即删除!

相关文章

js中的事件委托

1、什么是事件委托? ​ 事件委托, 他还有一个名字叫做事件代理,是JavaScript中常用的绑定事件的常用技巧,顾名思义,事件代理即是把原本需要绑定在子元素的响应事件委托给父元素,让父元素担当事件监听的职务…

有奖励!2023陕西省首台(套)重大技术装备产品项目申报条件、认定材料

本文整理了2023陕西省首台(套)重大技术装备产品项目申报条件,认定材料等相关内容,感兴趣的朋友快跟小编一起来看看吧! 一、重点支持方向及领域 重点支持方向及领域:高档工业母机、电力装备、大型矿山和冶金…

Windows下怎么更改文件扩展名

Win10如何修改文件扩展名 1、首先,我们打开我们的电脑,然后我们双击电脑上的一个文件夹; 2、进入文件夹之后,我们可以看到一个文件,此时的文件后缀名是不显示的,win10系统默认的是不显示后缀名的; 3、我们点击工具…

文件的拓展名(后缀名)怎么快速修改

最近有很多朋友在问,如何快速改名,比如将多个文件的后缀名进行修改,该如何操作呢?不知道的宝贝们,下面请随小编一起来试试吧,希望能给大家带来帮助。 所需工具 文件素材若干 操作步骤 将需要修改的所有文…

【文章学习系列之模型】SCALEFORMER

本章内容 文章概况模型结构主要方法多尺度框架跨尺度标准化模型输入编码损失函数 实验结果消融实验跨尺度标准化自适应损失函数 总结 文章概况 《SCALEFORMER: ITERATIVE MULTI-SCALE REFINING TRANSFORMERS FOR TIME SERIES FORECASTING》是2023年发表于ICLR上的一篇论文。作…

chatgpt赋能python:Python中按下某个按键的实现方法

Python中按下某个按键的实现方法 Python是一种广泛应用于各种领域的高级编程语言,可以用于编写各种类型的应用程序和工具。其中,它在游戏开发方面有着广泛的应用。而在游戏开发过程中,按键响应是至关重要的一个组成部分。本文将带领读者了解…

【第二节】变量和简单的数据类型

本节将结束python当中的变量和一部分数据类型(字符串和数字),并且介绍一些对应的方法 变量 在上一节的最后我们打印出了hello world print(hello world!)这次我们使用下面的代码实现一样的功能 message = hello world! print(message)可以看到 打印结果一模一样,而我们…

关于VUE3的一些基础知识点笔记

关于VUE3的一些基础知识点笔记 VUE3 vue2与vue3的一个重要区别是vue2是选项式API(composition API)而vue3是组合式API(option API)。 组合式API就是所有逻辑都在setup函数中,使用ref、watch等函数来组织代码&#xff…

easyX实践上手操作小项目

easyX实践上手操作小项目 效果展示主菜单的装饰玩法介绍界面开始游戏界面制作团队界面排行榜界面注:main()函数拓展数据库小结 这里我们学习过easyX的基础知识后,看看是否能实践操作一下,制作一个属于自己的游戏界面呢? 基础知识…

Verilog初级教程(13)Verilog中的块语句

文章目录 前言正文串行语句并行语句并行块内包含串行块的情况块名称 往期文章回顾 前言 所谓的块语句,无非就是一组语句,例如在initial或者always中,使用begin…end或者fork…join包裹的语句,都可以称为块语句。块语句有两种&…

Verilog初级教程(11)Verilog中的initial块

文章目录 前言正文语法格式initial块是用来干什么的?initial块何时开始又何时结束?一个模块中允许有多少个initial块? 参考资料写在最后 前言 仿真中通常会依次执行一组Verilog语句。这些语句被放置在一个程序块中。在Verilog中主要有两种类…

Verilog初级教程(8)Verilog中的assign语句

博文目录 写在前面正文赋值语法reg类型变量赋值隐性连续赋值组合逻辑设计举例说明 参考资料交个朋友 写在前面 本系列相关博文链接: Verilog初级教程(7)Verilog模块例化以及悬空端口的处理 Verilog初级教程(6)Veril…

夏宇闻《Verilog数字系统设计教程》 - 第1章 Verilog的基本知识

第1章 Verilog的基础知识 1.1 硬件描述语言HDL 硬件描述语言(HDL,hardware description language)是一种用形式化方法来描述数字电路和系统的语言。 设计者使用HDL设计数字系统后,通过电子设计自动化工具(EDA&#…

Verilog初级教程(12)Verilog中的generate块

文章目录 前言正文generate forgenerate ifgenerate case 参考资料本系列博文 前言 verilog中的generate块可以称为生成块,所谓生成,可以理解为复制。如果不太好理解,下面我们继续使用generate块。 generate块应用的场合通常是对模块进行批…

Verilog初级教程(17)Verilog中的case语句

文章目录 前言正文语法例子硬件原理图case与if-else有什么不同? 往期回顾参考资料及推荐关注 前言 case语句检查给定的表达式是否与列表中的其他表达式之一相匹配,并据此进行分支。它通常用于实现一个多路复用器。 如果要检查的条件很多,if…

Verilog初级教程(3)Verilog 数据类型

文章目录 前言正文变量可以取什么样的值?变量的取值意味着什么?主要的数据类型其他数据类型integertime / realtimereal例子 Verilog的字符串 写在最后 前言 这是本系列的第三篇博文,依然很基础,这个系列文章,主要是在…

Verilog初级教程(10)Verilog的always块

博文目录 写在前面正文语法什么是敏感列表?always块是用来干什么的?如果没有敏感列表怎么办?时序逻辑实例组合逻辑实例注意事项 参考资料 写在前面 由于刚毕业,又发生了很多事,在进入工作的准备期,就这样一…

verilog 入门教程

verilog 入门教程 1.1 什么是Verilog HDL? 1.2 Verilog的历史 1.3 Verilog的主要描述能力 2.1 Verilog-模块 2.2 Verilog-时延 2.3 Verilog-assign语句 2.4 Verilog-initial语句 2.5 Verilog-always语句 2.6 Verilog的结构化描述形式 2.7 Verilog-混合设计描述方式 2.8 Veri…

Verilog初级教程(14)Verilog中的赋值语句

文章目录 前言正文合理的左值过程性赋值(Procedural assignment)连续赋值过程连续性赋值 往期回顾 前言 何为赋值语句?即将值放到线网或者变量上,这种操作称为赋值,英文:assignment. 它有三种基本形式&…

嵌入式开发Verilog教程(二)——Verilog HDL设计方法概述

嵌入式开发Verilog教程(二)——Verilog HDL设计方法概述 前言一、Verilog HDL语言简介1.1 Verilog HDL语言是什么1.2 Verilog HDL设计复杂数字电路的优点1.2.1 传统设计方法——电路原理图输入法1.2.2 Verilog HDL设计方法与传统设计方法相比较的优势1.2…