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注解不生效问题相关推荐

  1. 记一次AOP+反射动态修改注解值成功后注解没有生效

    记一次AOP+反射动态修改注解值成功后注解没有生效 最近重新看了一下反射,突发奇想,在运行的时候在不同的方法上放入不同的注解值,然后获取到注解值进行修改.于是拿了hirbernate的@Validat ...

  2. @ResponseBody注解作用

    https://blog.csdn.net/qq_41378597/article/details/84295071 @ResponseBody注解的作用是将controller的方法返回的对象 通过 ...

  3. @RequestBody, @ResponseBody 注解详解

    简介: @RequestBody 作用: i) 该注解用于读取Request请求的body部分数据,使用系统默认配置的HttpMessageConverter进行解析,然后把相应的数据绑定到要返回的对 ...

  4. SpringBoot对于标注@ResponseBody注解返回JSON数据的处理

    前面我们已经知道,解析request要找到参数解析器和返回值处理器,而对于@ResponseBody注解的方法,其实就是其对应的返回值处理器再起作用 返回值处理器,我们知道有默认15种 : 其中处理器 ...

  5. 【Spring reference】@ResponseBody注解

    为什么80%的码农都做不了架构师?>>>    Spring reference写到: Mapping the response body with the @ResponseBod ...

  6. @data注解不生效_面试官:你经常在SpringBoot中使用的条件注解底层是如何实现的?你了解过吗?...

    SpringBoot内部提供了特有的注解:条件注解(Conditional Annotation).比如@ConditionalOnBean.@ConditionalOnClass.@Conditio ...

  7. @responseBody注解的使用

    1. @responseBody注解的作用是将controller的方法返回的对象通过适当的转换器转换为指定的格式之后,写入到response对象的body区,通常用来返回JSON数据或者是XML数据 ...

  8. @Data注解不生效的原因

    今天遇到@Data注解不生效的问题 @Data注解可以节省get,set等方法 解决方法 在idea中安装插件 安装完成之后重启idea 问题解决

  9. SpringMVC中使用@ResponseBody注解标注业务方法

    SpringMVC中使用@ResponseBody注解标注业务方法,将业务方法的返回值做成json输出给页面 导包: 除了一些spring的包之外,还需要jackson-annotations.jar ...

最新文章

  1. 一个小改动,CNN输入固定尺寸图像改为任意尺寸图像
  2. linux c glib中的hash table
  3. 码农翻身讲计算机基础:并发,同步与信号量
  4. 2012_01_26
  5. DevOps笔记-07:持续集成,持续交付,持续部署之间的区别
  6. 分享Java面试中的几个重要基础问题
  7. 审计署计算机培训心得体会,审计署计算机中级培训心得体会2018
  8. 直接拿来用!Vue.js 第三方常用插件盘点 | CSDN 博文精选
  9. mysql not in null_MySQL中NOTIN语句对NULL值的处理
  10. 简记GAN网络的loss
  11. 分页缓冲池内存过高_揭秘:为什么新买的8G内存却显示4G可用,是系统出错还是被人坑了?...
  12. MAB多臂老虎机/赌博机
  13. coolfire文章之七
  14. php里用钢笔画曲线,PS如何使用钢笔工具进行抠图
  15. ckplayer html播放本地,vue中使用ckplayer播放器
  16. 用文华财经软件编写埃尔德动力系统
  17. linux系统怎么关闭屏保,Linux关闭屏保
  18. html div 自动滚动到底部,javascript让DIV的滚动自动滚动到最底部-4种方法
  19. PHP根据键值,对二维数组重新进行分组
  20. 4个基本不等式的公式高中_高中数学基本不等式知识点

热门文章

  1. 五十五、Java单元测试类Junit
  2. 排序学习(LTR)经典算法:RankNet、LambdaRank和LambdaMart
  3. 无监督训练用堆叠自编码器是否落伍?ML博士对比了8个自编码器
  4. 对比学习(Contrastive Learning)相关进展梳理
  5. 阿里巴巴淘系开源大型3D家具数据集(3D-FUTURE)推动3D家居智能研究
  6. Score Function Trick及其在机器学习中的应用
  7. Codeforces 982 C. Cut 'em all! 图的遍历
  8. 使用格式工厂把视频进行旋转
  9. 项目交接文档_会计实操||会计人员交接范例
  10. 插入排序 php,直接插入排序,PHP实现