ARTS打卡计划第一周-Tips-ControllerAdvice的使用
通常在开发具体项目过程中我们可能会面临如下问题:
- 统一所有的json返回结果
- 统一处理所有controller中的异常,并且给不同异常不同的返回状态值
- 统一对返回的接口做数据校验或者加密,防止篡改
在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的使用相关推荐
- ARTS打卡计划第一周-Share-系统字典模块的设计
在软件开发的过程,经常有一些类型的字段信息:性别.学历.职级.车辆类别.公司类型.结算类型等.这些字段有2个特征:1是字段可选的类型是有限,2是字段可能会变化,我们把这种字段描述为字段字段. 本篇文 ...
- ARTS打卡计划第二周-Share-使用java注解对方法计时
现在有这样一种常见,系统中有一个接口,该接口执行的方法忽快忽慢,因此你需要去统计改方法的执行时间.刚开始你的代码可能如下: long start = System.currentTimeMillis( ...
- 原力计划第一周榜单揭晓!
10月24日,CSDN发布了"原力计划"活动,CSDN博主可报名参与"CSDN原力计划英雄榜",每周会公布"CSDN'原力计划'英雄榜"结果 ...
- ARTS打卡计划第三周-Tips
本周分享一个好用的小工具,java-faker:https://github.com/DiUS/java-faker,相应的python:https://github.com/joke2k/faker ...
- ARTS打卡计划第六周
Algorithms: https://leetcode-cn.com/problems/longest-palindromic-substring/ 中心扩展法首先考虑,当然看到有个动态规划,一直很 ...
- ARTS打卡计划第6周-REVIEW-超越编码的避免项目失败的软技能
https://medium.com/@viral_shah/beyond-coding-soft-skills-to-avoid-project-failures-4ed7821fa93a 做项目中 ...
- CTF题记——计划第一周
前言 大二上的计划第一次给自己交作业. Web 做SQL注入的题目有点拉垮,老老实实刷刷题吧. BabySQL 极客大挑战的题目--来源BUUCTF 测试一下,先看一下闭合符号是什么. ?userna ...
- 新星计划第一周,已经有不少新星出道,在冉冉升起了
随着5月25日零时的钟声一敲响,新星计划的大赛正式开始了.我有幸参与了mix混合赛道,怀着激动的心被运营小姐姐拉入了赛道群. 运营小姐姐介绍了比赛的规则和具体要求,宣布比赛正式开始.最最期待的就是导师 ...
- CTF题记——暑假计划第一周
本文目录 前言 Web [强网杯 2019]随便注 技能树HTTP协议基础认证 技能树目录遍历 bak文件 [极客大挑战 2019]EasySQL [极客大挑战 2019]Havefun [RoarC ...
- 12周精进计划(第一周):如何制定计划与目标
Think ★ Explore ★ Know 影响我的大学下半场,决定我们未来二十年 授课分享:S.F俱乐部.SunnyFutureClub张森鹏 一.笔记概要 每周为自己制定一个计划,订一个未来10 ...
最新文章
- 新款iPhone,比绿更绿
- css设置元素继承父元素宽度_CSS设置HTML元素的高度与宽度的各种情况总结
- linux分析文件格式,linux elf文件格式分析
- python类属性初始化_Python:如何模拟类属性初始化函数
- 网络爬虫--10.使用正则表达式的爬虫
- C#如何测量字符串的高度宽度和精确取得字符串的高度宽度
- android p 牛轧糖_Android牛轧糖快速设置图块
- ARM920T中断体系结构
- Vista系统Administrator帐户的激活与禁用
- webserver的使用
- s905l android5,魔百盒CM201-1-YS-S905L纯净安卓系统固件包
- html修改文本框样式,HTML实用文本框样式
- UltraVNC远程控制其他电脑
- ubuntu gnome桌面农历日历显示
- 计算机教学拼音打字教案,三年级下册信息技术课用拼音写汉字教案
- VMware虚拟机更改静态IP报错Unit network.service entered failed state解决方案
- Netbackup 8.1 许可证
- Precision,Recall,F1score,Accuracy的理解
- 【OpenGL学习笔记五】 索引缓冲对象EBO
- H5调用相机,裁剪,压缩照片