通常在开发具体项目过程中我们可能会面临如下问题:
- 统一所有的json返回结果
- 统一处理所有controller中的异常,并且给不同异常不同的返回状态值
- 统一对返回的接口做数据校验或者加密,防止篡改
在spring中的处理方式是使用
@RestControllerAdvicepublic class CommonResponseDataAdvice implements ResponseBodyAdvice
上述代码中定义了一个注解IgnoreResponseAdvice,如果controller的类或者方法有这个注解就不做处理。下面这个例子展现的是如何在controller抛出异常的时候,自动包装成为commonRespons。
@RestControllerAdvicepublic class GlobalExceptionAdvice { @ExceptionHandler(value = ParamException.class) public CommonResponsehandlerParamException(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("系统错误"); }}
详细的代码见
特别的,这个文章提供了几种其他的解决方案: