使用@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 ...
随机推荐
- yum 安装失败解决思路$releasever(curl#6 - "Could not resolve host: mirrorlist.centos.org; Unknown error")
问题 公司使用刀片机的系统版本是CentOS 7.9.2009(Core),本人在重新安装虚拟机时,也使用对应的系统版本,在安装软件时,yum无法正常使用,一开始觉得,centos的release版本 ...
- Redis 数据库配置与应用
Redis 是一个key-value存储系统.Redis是一个开源的使用ANSI C语言编写.遵守BSD协议.支持网络.可基于内存亦可持久化的日志型.Key-Value数据库,并提供多种语言的API. ...
- 遥感图像处理笔记之【Multi-label Land Cover Classification with Deep Learning】
遥感图像处理学习(3) 前言 遥感图像处理方向的学习者可以参考或者复刻 本文初编辑于2023年12月14日 2024年1月24日搬运至本人博客园平台 文章标题:Multi-label Land Cov ...
- [Java] 解析Xml配置文件
1.解析方法 import javax.xml.parsers.DocumentBuilder;import javax.xml.parsers.DocumentBuilderFactory;impo ...
- 零基础入门学习Java课堂笔记 ——day01
Java语法 1.注释.标识符.关键字 注释 不会被程序执行的代码或者块 //双斜杠表示单行注释 /*表示多行注释*/ 标识符.关键字 关键词系统事先定义好的,我们能直接拿来用的,不能作为变量名使用 ...
- 针对SpringBoot服务端返回的空对象和空数组问题
返回的Json会自动过滤掉空指针的对象,但是若遇到非空指针的没有任何内容的对象,举例如下: public class Person { private String name; private Int ...
- SQLWorkbench使用自定义JDBC驱动连接数据库
一.Windows上使用SQLWorkbench 1. 添加CloudDB的驱动,点击"Manage Driver". Name : Fandatsys-CDB sample U ...
- [Ngbatis源码学习][SpringBoot] ApplicationContextInitializer接口类的使用和原理解读
ApplicationContextInitializer接口类的使用和原理解读 在看Ngbatis源码的过程中,看到了自定义的ApplicationContextInitializer实现类,对Ap ...
- C++ 单例模式以及内存管理
引用: https://zhuanlan.zhihu.com/p/37469260 https://www.cnblogs.com/xiaolincoding/p/11437231.html http ...
- std::string std::wstring char w_char 内部中文编码
最近在处理一个字符串转码问题,故记录一下过程 该需求是外部 sdk 的一个 api 需要一个 char* 字符串路径入参,我以往是将宽字符串转为 UTF8 后再传给 sdk 这次这个 api 似乎不接 ...