配置
大致说下流程,
-
首先我们自定义一个自己的异常类CustomException,继承RuntimeException。再写一个异常管理类ExceptionManager,用来抛出自定义的异常。
-
然后使用Spring提供的注解@RestControllerAdvice或者@ControllerAdvice写一个统一异常处理的类,在这个类中写一个带有@ExceptionHandler(Exception.class)注解的方法,这个方法会接收到所有抛出的异常,在方法内部我们就可以写自己的异常处理逻辑。
-
如果参数是CustomException类型,我们就自定义返回体,返回异常字典的错误信息。如果是其它类型的异常就返回系统异常。
话不多说,上代码。
一、自定义的异常类
@Data@NoArgsConstructorpublic class CustomException extends RuntimeException { public CustomException(String code, String msg) { super(code); this.code = code; this.msg = msg; } private String code; private String msg;}
二、异常管理类
@Componentpublic class ExceptionManager { @Resource Environment environment; public CustomException create(String code) { return new CustomException(code, environment.getProperty(code)); }}
Environment是spring的环境类,会包含所有properties文件的键值对。
三、异常字典 exception.properties
# sso异常测试EC00001=SSO的WEB层错误
需要加载到spring的环境中,我是用配置类加载的,方式如下:
@Component@PropertySource(value = {"exception.properties"}, encoding = "UTF-8")public class LoadProperty {}
四、全局异常捕捉类
@RestControllerAdvicepublic class GlobalExceptionHandler { @ExceptionHandler(Exception.class) public ApiResult handlerException(Exception e) { //如果是自定义的异常,返回对应的错误信息 if (e instanceof CustomException) { e.printStackTrace(); CustomException exception = (CustomException) e; return ApiResult.error(exception.getCode(), exception.getMsg()); } else { //如果不是已知异常,返回系统异常 e.printStackTrace(); return ApiResult.error("SYS_EXCEPTION", "系统异常"); } }}
ApiResult是我处定义的接口json返回,代码也一并贴上.
//ApiResult/** * @author kingboy--KingBoyWorld@163.com * @date 2017/7/23 下午7:19 * @desc 返回体. */@Datapublic abstract class ApiResult { protected String code; /** * 成功的返回 * @param data 数据 * @return 正常返回体 */ public static ApiResult success(Object data) { return new SuccessApiResult(data); } /** * 错误返回 * @param errorCode 错误码 * @param errorMessage 错误信息 * @return 错误返回体 */ public static ApiResult error(String errorCode, String errorMessage) { return new ErrorApiResult(errorCode, errorMessage); }}//SuccessApiResult@Datapublic class SuccessApiResult extends ApiResult { private Object data; SuccessApiResult(Object data) { this.code = "0"; this.data = data; }}//ErrorApiResult@Datapublic class ErrorApiResult extends ApiResult { private String msg; ErrorApiResult(String code, String msg) { this.code = code; this.msg = msg; }}
使用示例
/** * @author kingboy--KingBoyWorld@163.com * @date 2017/8/1 下午5:57 * @desc 异常测试. */@RestController@RequestMapping("/exception")public class ExceptionController { @Resource ExceptionManager exceptionManager; @RequestMapping("/controller") public String exceptionInController() { if (true) { throw exceptionManager.create("EC00001"); } return "controller exception!"; }}
返回信息如下:
{ "code": "EC00001", "msg": "SSO的WEB层错误"}