记一次@ResponseBody注解不生效问题
1、需求引入
前端(postman)调用后端方法要求如下这样调用,使用raw,格式是application/json,并且要求返回json格式字符串
2、示例代码
后端可以使用如下方式接收,以及返回
在Controller中,我们如果调用方法时入参是json,而方法实际参数是一个Java bean对象,我们可以加入@RequestBody注解,来把json串解析成我们的Java bean对象,返回使用@ResponseBody,将Java对象改成json格式出参,代码如下:
@RequestMapping("/test")@ResponseBodypublic List<String> testReturn(@RequestBody StationVo stationVo){log.info("入参:"+stationVo.getStationCode());List<String> result = new ArrayList<>();result.add("我是出参");return result;}
3、问题出现
正常来说结果应该是正常的,但是我确404如下:
4、原因分析
这就很奇怪了,我明明加了ResponseBody注解,这应该是不加这个注解会报的错,(ps.因为不加这个注解,会默认返回页面,而spring找不到这个页面,会报404错误,而加上此注解,标识此时应该返回的是数据,而不是页面。),然后百度了各种解决办法,什么缺jar包的,什么直接使用@RestController(ps.@RestController=@Controller+@ResponseBody)都不生效,然后决定从源码入手。。。
5、解决问题
最后发现项目中自定义了返回值处理类,将本该处理@ResponseBody的处理类RequestResponseBodyMethodProcessor替换成了自己项目的处理器类,由此导致了@ResponseBody。最后把RequestResponseBodyMethodProcessor加入到RequestMappingHandlerAdapter对应的returnValueHandlers中,问题解决。大家如果碰到类似问题,可以debug HandlerMethodReturnValueHandlerComposite类的selectHandler方法,如下,handler是不是正确的,正常来说@ResponseBody对应RequestResponseBodyMethodProcessor;看this.returnValueHandlers中是否有RequestResponseBodyMethodProcessor处理器类,如果没有加进去就解决问题了
终于得到了想要的结果
总结
spring原生的的HandlerMethodReturnValueHandler大概一共有15个处理器类,分别处理不同的返回类型,其中RequestResponseBodyMethodProcessor是处理返回json类型的,当方法使用@ResponseBody注解时,便会调用此处理器类,需检查returnValueHandlers中是否有RequestResponseBodyMethodProcessor处理器类
参考文档:
Spring MVC源码(三) ----- @RequestBody和@ResponseBody原理解析
记一次@ResponseBody注解不生效问题相关推荐
- 记一次AOP+反射动态修改注解值成功后注解没有生效
记一次AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改.于是拿了hirbernate的@Validat ...
- @ResponseBody注解作用
https://blog.csdn.net/qq_41378597/article/details/84295071 @ResponseBody注解的作用是将controller的方法返回的对象 通过 ...
- @RequestBody, @ResponseBody 注解详解
简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...
- SpringBoot对于标注@ResponseBody注解返回JSON数据的处理
前面我们已经知道,解析request要找到参数解析器和返回值处理器,而对于@ResponseBody注解的方法,其实就是其对应的返回值处理器再起作用 返回值处理器,我们知道有默认15种 : 其中处理器 ...
- 【Spring reference】@ResponseBody注解
为什么80%的码农都做不了架构师?>>> Spring reference写到: Mapping the response body with the @ResponseBod ...
- @data注解不生效_面试官:你经常在SpringBoot中使用的条件注解底层是如何实现的?你了解过吗?...
SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...
- @responseBody注解的使用
1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据 ...
- @Data注解不生效的原因
今天遇到@Data注解不生效的问题 @Data注解可以节省get,set等方法 解决方法 在idea中安装插件 安装完成之后重启idea 问题解决
- SpringMVC中使用@ResponseBody注解标注业务方法
SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些spring的包之外,还需要jackson-annotations.jar ...
最新文章
- 一个小改动,CNN输入固定尺寸图像改为任意尺寸图像
- linux c glib中的hash table
- 码农翻身讲计算机基础:并发,同步与信号量
- 2012_01_26
- DevOps笔记-07:持续集成,持续交付,持续部署之间的区别
- 分享Java面试中的几个重要基础问题
- 审计署计算机培训心得体会,审计署计算机中级培训心得体会2018
- 直接拿来用!Vue.js 第三方常用插件盘点 | CSDN 博文精选
- mysql not in null_MySQL中NOTIN语句对NULL值的处理
- 简记GAN网络的loss
- 分页缓冲池内存过高_揭秘:为什么新买的8G内存却显示4G可用,是系统出错还是被人坑了?...
- MAB多臂老虎机/赌博机
- coolfire文章之七
- php里用钢笔画曲线,PS如何使用钢笔工具进行抠图
- ckplayer html播放本地,vue中使用ckplayer播放器
- 用文华财经软件编写埃尔德动力系统
- linux系统怎么关闭屏保,Linux关闭屏保
- html div 自动滚动到底部,javascript让DIV的滚动自动滚动到最底部-4种方法
- PHP根据键值,对二维数组重新进行分组
- 4个基本不等式的公式高中_高中数学基本不等式知识点
热门文章
- 五十五、Java单元测试类Junit
- 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart
- 无监督训练用堆叠自编码器是否落伍?ML博士对比了8个自编码器
- 对比学习(Contrastive Learning)相关进展梳理
- 阿里巴巴淘系开源大型3D家具数据集(3D-FUTURE)推动3D家居智能研究
- Score Function Trick及其在机器学习中的应用
- Codeforces 982 C. Cut 'em all! 图的遍历
- 使用格式工厂把视频进行旋转
- 项目交接文档_会计实操||会计人员交接范例
- 插入排序 php,直接插入排序,PHP实现