使用@RequestBody注解踩的坑
一、问题由来
最近在和前端调试一个自己写的接口时,频频出现问题,让我很是烦恼。因此写下这篇博文来记录开发中遇到的一些问题。第一个问题是
前端页面传递参数后,后台不能正常接收参数。我写好接口以后,通过swagger测试,发现没问题,然后就和前端进行调试,可是前端进
行调试时频频出错。Controller的代码如下,

使用Swagger工具调试接口时,也没有问题。因为文件是存放在测试环境上面的,所以报了一个文件不存在是正确的。
可问题是前端测试时报的确实另外一个错,文件ID不存在,这个错误也是自己主动抛出的异常。这就很尴尬了。

二、问题分析
经过反复的排查,发现有一个地方存在问题,那就是参数的传递方式不一样。前端开发人员传递参数时的方式是Request Payload,而我在使用Swagger测试时
传递参数的方式为Form Data。因为这一不同导致了BUG的出现,问题找到了,我想应该会比较好解决。

三、解决方案
发现这个问题,我立马和前端人员协商,看看是他修改还是我修改。去看了之前已经做好的一些功能,想看看使用Post请求传递参数的方式是什么。
结果发现也是Request Payload这种方式,Controller中也是使用PostMapping。接着我开始修改后台代码,修改后的代码如下,

使用Swagger测试情况如下,测试正常。部署到测试服务器时,数据也正确返回了。

我本以为现在应该没问题了,测试也正常了。可是前端测试人员给我反馈,还是不行没有数据返回,返回的错误信息是没有没有查询到文件。
我让他把传递的参数单独发给我,我直接去数据库中查询,发现有数据,这就奇了怪了。

为什么我在本地测试时,查询没问题,前端人员使用前端项目访问时就出问题呢?只得继续排查。让前端人员调试时直接连接我的后台,打断点进行调试。
这是发现问题:使用这种方式,public ResponseEntity<JsonResult<String>> previewExcel(@RequestBody String fileId){}接收到的参数不是我
想要的,接收到的fileId的值为: "fileid:'379ecdefeed5468c845f1984fc26f78c'",就相当于把传递进来的整个JSON数据映射到fileId上了,而并不是仅仅是后
面的值。确定这个问题后,我修改了代码将@RequestBody后面的单个变量修改为一个参数输入的类如下。

然后再次调试,结果如下。变化是参数的传递方式还是Request Payload,但是里面的参数变为JSON格式的数据了。然后将代码部署到测试环境,前端人员测试时正确,问题解决。

以前开发时,还真没有注意这些细节问题。Controller中使用不同的注解,传递参数的方式也会不一样。同时也对于@RequestBody注解有了更深刻的理解。
这个注解是将Post请求中的JSON数据映射到一个类中,不能单独映射到某个字段中,即使是单个字段最好也是使用请求输入类来接收收据。吃一堑,长一智,
通过这次采坑,又学习到不少东西。
使用@RequestBody注解踩的坑的更多相关文章
- 简单看看@RequestBody注解原理
又到了很无聊的时候了,于是随便看看源码假装自己很努力的样子,哈哈哈: 记得上一篇博客随便说了一下RequestBody的用法以及注意的问题,这个注解作为非常常用的注解,也是时候了解一波其中的原理了. ...
- 从零开始学 Java - Spring 支持 CORS 请求踩的坑
谁没掉进过几个大坑 记得好久之前,总能时不时在某个地方看到一些标语,往往都是上面一个伟人的头像,然后不管是不是他说的话,下面总是有看起来很政治正确且没卵用的屁话,我活到目前为止,最令我笑的肚子痛得是下 ...
- @requestBody注解的使用
1.@requestBody注解常用来处理content-type不是默认的application/x-www-form-urlcoded编码的内容,比如说:application/json或者是ap ...
- dubbox注解的一个坑
我和我同事Daniel排查的一个问题,原文是我同事Daniel写的,我做了些修改了补充. 我们dubbox的provider端有很多service开发时没有考虑到幂等问题,于是只能暂时关掉dubbo的 ...
- webuploader插件,我踩得坑
我在目前的公司做的项目要么是原生写法去做项目,要么就是vue+webpack做项目,但是vue这部分只是用了模板template,vue其他的都没用. 有一个项目需要做上传图片的功能,老大扔给我一个插 ...
- 谈谈调用腾讯云【OCR-通用印刷体识别】Api踩的坑
一.写在前面 最近做项目需要用到识别图片中文字的功能,本来用的Tesseract这个写的,不过效果不是很理想. 随后上网搜了一下OCR接口,就准备使用腾讯云.百度的OCR接口试一下效果.不过这个腾讯云 ...
- springMVC中@RequestParam和@RequestBody注解的用法
springMVC中@RequestParam注解用在Controller层获解析.提取参数,当然你也可以用request.getParameter("name")来获取参数,而@ ...
- 浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别
浅谈@RequestMapping @ResponseBody 和 @RequestBody 注解的用法与区别 Spring 2.5 版本新增了注解功能, 通过注解,代码编写简化了很多:但熟悉注解的使 ...
- @RequestBody注解用法
做Java已经有8个多月了,但是基本没有学习过Java语言,因此在项目中写代码基本靠的是其他语言的基础来写Java代码,写出来的很多代码虽然能用,但是感觉很不地道,虽然从来没有同事说过,但是我自己觉得 ...
- Asp.Net Core中使用Swagger,你不得不踩的坑
很久不来写blog了,换了新工作后很累,很忙.每天常态化加班到21点,偶尔还会到凌晨,加班很累,但这段时间,也确实学到了不少知识,今天这篇文章和大家分享一下:Asp.Net Core中使用Swagge ...
随机推荐
- 【一】分布式训练---单机多卡多机多卡(飞桨paddle1.8)
1.分布式训练简介 分布式训练的核心目的: 加快模型的训练速度.通过对训练任务按照一定方法拆分分配到多个计算节点进行计算,再按照一定的方法对需要汇总的信息进行聚合,从而实现加快训练速度的目的. 1.1 ...
- 深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型、LEO模型、Reptile模型
深度学习应用篇-元学习[14]:基于优化的元学习-MAML模型.LEO模型.Reptile模型 1.Model-Agnostic Meta-Learning Model-Agnostic Meta-L ...
- MySQL【四】---案例实战{拆分多表、外键创建等}
1.准备数据 数据准备 create database jing_dong charset = utf8mb4; 创建一个商品goods数据表: create table goods( id int ...
- 2.6 CE修改器:代码注入功能
从本关开始,各位会初步接触到CE的反汇编功能,这也是CE最强大的功能之一.在第6关的时候我们说到指针的找法,用基址定位动态地址.但这一关不用指针也可以进行修改,即使对方是动态地址,且功能更加强大.代码 ...
- 线程锁(Python)
一.多个线程对同一个数据进行修改 from threading import Thread,Lock n = 0 def add(lock): for i in range(500000): glob ...
- PHP实现字符串反转
方法一 用自带的函数strrev echo strrev('hello'); 方法二 自写循环方法 $str = 'hello'; $i = strlen($str); $newStr=''; whi ...
- Android 相册
- 《ASP.NET Core 与 RESTful API 开发实战》-- (第8章)-- 读书笔记(上)
第 8 章 认证和安全 8.1 认证 认证(Authentication)是指验证用户身份的过程,授权(Authorization)是验证一个已经通过认证的用户是否有权限做某些事的过程 常见的 HTT ...
- ABC 304
T4 在一个平面上有一块面积无限的蛋糕,给出 \(n\) 颗草莓的所在位置和 \(a\,(b)\) 条平行与 \(x\,(y)\) 轴的切刀位置. 切刀会把蛋糕沿 \(x\,(y)\) 轴切开.因此一 ...
- 好书推荐之《JAVA编程思想》
名人推荐 真是一本透着编程思想的书. 上面的书让你从微观角度了解 Java,而这本书则可以让你从一个宏观角度了解 Java. 这本书和 Java 核心技术的厚度差不多,但这本书的信息密度比较大. 所以 ...