博客
关于我
强烈建议你试试无所不能的chatGPT,快点击我
ARTS打卡计划第一周-Tips-ControllerAdvice的使用
阅读量:6818 次
发布时间:2019-06-26

本文共 3314 字,大约阅读时间需要 11 分钟。

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

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

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

@RestControllerAdvicepublic class CommonResponseDataAdvice implements ResponseBodyAdvice {    @Override    @SuppressWarnings("all")    public boolean supports(MethodParameter methodParameter,                            Class
> 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
> aClass, ServerHttpRequest serverHttpRequest, ServerHttpResponse serverHttpResponse) { CommonResponse response = new CommonResponse<>(0, ""); if (null == o) { return response; } else if (o instanceof CommonResponse) { response = (CommonResponse) o; } else { response.setData(o); } return response; }}

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

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

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

@RestControllerpublic 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://www.cnblogs.com/dongqiSilent/p/10742803.html

你可能感兴趣的文章
DataTable数据存入指定路径的Excel文件
查看>>
【Lua】特性和一些基础语法
查看>>
[转]Web Api系列教程第2季(OData篇)(二)——使用Web Api创建只读的OData服务
查看>>
eclipse设置系统字体
查看>>
seq命令
查看>>
[Python] Boolean Or "Mask" Index Arrays filter with numpy
查看>>
有了#ifdef 为什么还需要#if defined
查看>>
eclipse中.properties文件不能输入中文的解决办法
查看>>
[Unit Testing] Mock a Node module's dependencies using Proxyquire
查看>>
C++中malloc/free和new/delete 的使用
查看>>
ASP.NET MVC读取XML并使用ViewData显示
查看>>
4.lists(双向链表)
查看>>
微服务(Microservices )简介
查看>>
.NET中的流
查看>>
在ASP.NET MVC 4中使用Kendo UI Grid
查看>>
SpringCloud_概述与入门
查看>>
vim精简版教程
查看>>
干货 | 用python3+dlib教你的程序察言观色
查看>>
Kafka的Consumer负载均衡算法
查看>>
换个姿势学数学:二次函数与拆弹部队
查看>>