需要了解如下几个注解
1. @ControllerAdvice:配置控制器通知的
通过@ControllerAdvice注解可以将对于控制器的全局配置放在同一个位置
注解了@ControllerAdvice的类的方法可以使用@ExceptionHandler、@InitBinder、@ModelAttribute注解到方法上。
@ExceptionHandler:用于全局处理控制器里的异常。
@InitBinder:用来设置WebDataBinder,用于自动绑定前台请求参数到Model中。
@ModelAttribute:本来作用是绑定键值对到Model中,此处让全局的@RequestMapping都能获得在此处设置的键值对
@ControllerAdvice注解将作用在所有注解了@RequestMapping的控制器的方法上。
@ControllerAdvice(annotations = RestController.class)指向所有带有注解@RestController的控制器
2. @ResponseBody:@ResponseBody是作用在方法上的,@ResponseBody 表示该方法的返回结果直接写入 HTTP response body 中,在使用 @RequestMapping后,返回值通常解析为跳转路径,但是加上 @ResponseBody 后返回结果不会被解析为跳转路径,而是直接写入 HTTP response body 中。 比如异步获取 json 数据,加上 @ResponseBody 后,会直接返回 json 数据。@RequestBody 将 HTTP 请求正文插入方法中,使用适合的 HttpMessageConverter 将请求体写入某个对象。
3. @ExceptionHandler:统一处理某一类异常,从而能够减少代码重复率和复杂度
4. @ResponseStatus注解有两种用法,一种是加载自定义异常类上,一种是加在目标方法中
那我们首先类说一下加在目标方法上的这种情况,注解中有两个参数,value属性设置异常的状态码,reaseon是异常的描述,
如果只是为了指示返回状态码,最好不要添加reason属性。
如果添加了reason属性,且reason不为"",且code > 0(哪怕状态码是200),会对当前请求走错误处理。
异常信息实体
@Data
public class ApiResult implements Serializable {
/**
* @Fields serialVersionUID :
*/
private static final long serialVersionUID = -1450204351804859591L;
private ApiResult() {};
public static ApiResult newInstance() {
return new ApiResult();
}
private String msg;
private boolean flag;
private Object object;
}
构建异常返回信息
public final class ApiResultGenerator {
public static ApiResult result(boolean flag, String msg, Object object, Throwable throwable) {
ApiResult apiResult = ApiResult.newInstance();
apiResult.setFlag(flag);
apiResult.setMsg(msg == "" ? "success" : msg);
apiResult.setObject(object);
return apiResult;
}
public static ApiResult successResult(Object object) {
return result(true, "", object, null);
}
public static ApiResult errorApiResult(String msg, Throwable throwable) {
return result(false, msg, "", throwable);
}
}
拦截所有RestController下的异常
//@ControllerAdvice注解是用来配置控制器通知的
//@ControllerAdvice的annotations属性值为RestController.class,
//也就是只有添加了@RestController注解的控制器才会进入全局异常处理
@ControllerAdvice(annotations = RestController.class)
@ResponseBody
public class RestExceptionHandler {
//来配置需要拦截的异常类型,默认是全局类型
@ExceptionHandler
//配置遇到该异常后返回数据时的StatusCode的值
@ResponseStatus
public ApiResult runTimeExceptionHandler(Exception exception) {
return ApiResultGenerator.errorApiResult(exception.getMessage(), exception);
}
}