springboot项目全局异常处理

需要了解如下几个注解

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);
	}
}

 

你可能感兴趣的:(java)