通常在开发具体项目过程中我们可能会面临如下问题:

  1. 统一所有的json返回结果
  2. 统一处理所有controller中的异常,并且给不同异常不同的返回状态值
  3. 统一对返回的接口做数据校验或者加密,防止篡改

在spring中的处理方式是使用@RestControllerAdvice注解。下面是一个例子,可以将所有的controller中的返回结果,包装成一个CommonResponse。

@RestControllerAdvice
public class CommonResponseDataAdvice implements ResponseBodyAdvice<Object> {@Override@SuppressWarnings("all")public boolean supports(MethodParameter methodParameter,Class<? extends HttpMessageConverter<?>> aClass) {if (methodParameter.getDeclaringClass().isAnnotationPresent(IgnoreResponseAdvice.class)) {return false;}if (methodParameter.getMethod().isAnnotationPresent(IgnoreResponseAdvice.class)) {return false;}return true;}@Nullable@Override@SuppressWarnings("all")public Object beforeBodyWrite(@Nullable Object o,MethodParameter methodParameter,MediaType mediaType,Class<? extends HttpMessageConverter<?>> aClass,ServerHttpRequest serverHttpRequest,ServerHttpResponse serverHttpResponse) {CommonResponse<Object> response = new CommonResponse<>(0, "");if (null == o) {return response;} else if (o instanceof CommonResponse) {response = (CommonResponse<Object>) o;} else {response.setData(o);}return response;}
}

  上述代码中定义了一个注解IgnoreResponseAdvice,如果controller的类或者方法有这个注解就不做处理。下面这个例子展现的是如何在controller抛出异常的时候,自动包装成为commonRespons。

@RestControllerAdvice
public class GlobalExceptionAdvice {@ExceptionHandler(value = ParamException.class)public CommonResponse<String> handlerParamException(HttpServletRequest req,ParamException ex) {CommonResponse<String> response = new CommonResponse<>(400,"param error");response.setData(ex.getMessage());return response;}@ExceptionHandler(value = BusinessException.class)public CommonResponse<String> handlerBusinessException(HttpServletRequest req,BusinessException ex) {CommonResponse<String> response = new CommonResponse<>(500,"business error");response.setData(ex.getMessage());return response;}@ExceptionHandler(value = SystemException.class)public CommonResponse<String> handlerSystemException(HttpServletRequest req,SystemException ex) {CommonResponse<String> response = new CommonResponse<>(700,"system error");response.setData(ex.getMessage());return response;}
}

  对比下面的controller能更清楚的明白如何使用。

@RestController
public class IndexController {@RequestMapping("/")String home() {return "Hello World!";}@IgnoreResponseAdvice@RequestMapping("/hi")String hi() {return "Hello World!";}@RequestMapping("/param")String param() throws Exception {throw new ParamException("参数错误");}@RequestMapping("/business")String business() throws Exception {throw new BusinessException("业务错误");}@RequestMapping("/system")String system() throws Exception {throw new SystemException("系统错误");}
}

  详细的代码见 https://gitee.com/dongqihust/arst/tree/master/custom-response

  特别的,这个文章提供了几种其他的解决方案:https://www.baeldung.com/exception-handling-for-rest-with-spring

转载于:https://www.cnblogs.com/dongqiSilent/p/10742803.html

ARTS打卡计划第一周-Tips-ControllerAdvice的使用相关推荐

  1. ARTS打卡计划第一周-Share-系统字典模块的设计

    在软件开发的过程,经常有一些类型的字段信息:性别.学历.职级.车辆类别.公司类型.结算类型等.这些字段有2个特征:1是字段可选的类型是有限,2是字段可能会变化,我们把这种字段描述为字段字段.  本篇文 ...

  2. ARTS打卡计划第二周-Share-使用java注解对方法计时

    现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...

  3. 原力计划第一周榜单揭晓!

    10月24日,CSDN发布了"原力计划"活动,CSDN博主可报名参与"CSDN原力计划英雄榜",每周会公布"CSDN'原力计划'英雄榜"结果 ...

  4. ARTS打卡计划第三周-Tips

    本周分享一个好用的小工具,java-faker:https://github.com/DiUS/java-faker,相应的python:https://github.com/joke2k/faker ...

  5. ARTS打卡计划第六周

    Algorithms: https://leetcode-cn.com/problems/longest-palindromic-substring/ 中心扩展法首先考虑,当然看到有个动态规划,一直很 ...

  6. ARTS打卡计划第6周-REVIEW-超越编码的避免项目失败的软技能

    https://medium.com/@viral_shah/beyond-coding-soft-skills-to-avoid-project-failures-4ed7821fa93a 做项目中 ...

  7. CTF题记——计划第一周

    前言 大二上的计划第一次给自己交作业. Web 做SQL注入的题目有点拉垮,老老实实刷刷题吧. BabySQL 极客大挑战的题目--来源BUUCTF 测试一下,先看一下闭合符号是什么. ?userna ...

  8. 新星计划第一周,已经有不少新星出道,在冉冉升起了

    随着5月25日零时的钟声一敲响,新星计划的大赛正式开始了.我有幸参与了mix混合赛道,怀着激动的心被运营小姐姐拉入了赛道群. 运营小姐姐介绍了比赛的规则和具体要求,宣布比赛正式开始.最最期待的就是导师 ...

  9. CTF题记——暑假计划第一周

    本文目录 前言 Web [强网杯 2019]随便注 技能树HTTP协议基础认证 技能树目录遍历 bak文件 [极客大挑战 2019]EasySQL [极客大挑战 2019]Havefun [RoarC ...

  10. 12周精进计划(第一周):如何制定计划与目标

    Think ★ Explore ★ Know 影响我的大学下半场,决定我们未来二十年 授课分享:S.F俱乐部.SunnyFutureClub张森鹏 一.笔记概要 每周为自己制定一个计划,订一个未来10 ...

最新文章

  1. 新款iPhone,比绿更绿
  2. css设置元素继承父元素宽度_CSS设置HTML元素的高度与宽度的各种情况总结
  3. linux分析文件格式,linux elf文件格式分析
  4. python类属性初始化_Python:如何模拟类属性初始化函数
  5. 网络爬虫--10.使用正则表达式的爬虫
  6. C#如何测量字符串的高度宽度和精确取得字符串的高度宽度
  7. android p 牛轧糖_Android牛轧糖快速设置图块
  8. ARM920T中断体系结构
  9. Vista系统Administrator帐户的激活与禁用
  10. webserver的使用
  11. s905l android5,魔百盒CM201-1-YS-S905L纯净安卓系统固件包
  12. html修改文本框样式,HTML实用文本框样式
  13. UltraVNC远程控制其他电脑
  14. ubuntu gnome桌面农历日历显示
  15. 计算机教学拼音打字教案,三年级下册信息技术课用拼音写汉字教案
  16. VMware虚拟机更改静态IP报错Unit network.service entered failed state解决方案
  17. Netbackup 8.1 许可证
  18. Precision,Recall,F1score,Accuracy的理解
  19. 【OpenGL学习笔记五】 索引缓冲对象EBO
  20. H5调用相机,裁剪,压缩照片

热门文章

  1. 人工智能时代的危机_AI信任危机:如何前进
  2. python中wordcloud函数不同形状云图_10行Python代码生成任意形状的文字云图
  3. rk1808交叉编译opencv_我用AI视觉模组DIY了一个驾驶疲劳监测仪
  4. 计算机备份u盘,如何备份电脑系统到u盘
  5. mysql客户端navicat连接数据库
  6. 自动化测试介入的时机
  7. 请问两个div之间的上下距离怎么设置
  8. Intel DCM 携手DELL共同推出关于DCIM的联合调研
  9. CSS3 修改和去除移动端点击事件出现的背景框
  10. 什么时候建立分区的时候需要建立EFI分区