统一异常处理
在项目中,经常会对一些条件之类的参数进行校验,如果有问题,则向前端返回错误信息。之前的项目里,只有在controller层可以返回错误信息,而在service层,只能返回固定的结果,不能说明错误信息。此时可以通过自定义异常,然后统一处理来解决。
对于统一异常,通常有四种解决方法,推荐使用 第一种 或者 第四种,分别如下
(推荐)方法一: 通过配置文件设置异常处理
自定义异常
/**
* 统一异常信息
*
* @author feiyu127
* @date 2018-06-06 11:19
*/
public class CustomException extends RuntimeException {
public CustomException() {
}
public CustomException(String message) {
super(message);
}
public CustomException(String message, Throwable cause) {
super(message, cause);
}
}
对异常捕获并处理
/**
* @author feiyu127
* @date 2018-06-06 11:15
*/
@Configuration
public class WebMvcConfigure extends WebMvcConfigurerAdapter {
private final Logger logger = LoggerFactory.getLogger(WebMvcConfigurer.class);
// 对自定义的异常进行处理,非自定义的不处理
@Override
public void configureHandlerExceptionResolvers(List<HandlerExceptionResolver> exceptionResolvers) {
exceptionResolvers.add((request, response,handler, ex) -> {
if (ex instanceof CustomException) {
Result result = ResultUtil.buildFail(ex.getMessage());
responseResult(response, result);
}
return new ModelAndView();
});
}
// 输出json格式错误信息
private void responseResult(HttpServletResponse response, Result result) {
response.setCharacterEncoding("UTF-8");
response.setHeader("Content-type", "application/json;charset=UTF-8");
response.setStatus(200);
try {
response.getWriter().write(JSON.toJSONString(result));
} catch (IOException ex) {
logger.error(ex.getMessage());
}
}
}
在以上配置后,在service层校验失败后,可以主动去抛自定义异常来直接向前端返回错误提示信息
方法二:使用springmvc中自带的简单异常处理器 SimpleMappingExceptionResolver
方法三 : 使用 @ExceptionHandler 注解实现异常处理
在BaseController 里对异常进行设置,需要捕获的controller都需继承该BaseController
public class BaseController {
@ExceptionHandler
@ResponseBody
public Map<String, Object> exp(HttpServletRequest request, Exception ex) {
Map<String, Object> data = new HashMap<String, Object>();
if(ex instanceof CustomException) {
CustomException e = (CustomException)ex;
}
data.put("msg", ex.getMessage());
data.put("success", false);
data.put("data", null)
}
}
(推荐)方法四: @ControllerAdvice 配合 @ExceptionHandler 使用,达到方法一的效果
@RestControllerAdvice
public class ExceptionHandlerController {
@ExceptionHandler
public Result handleCustomException(Exception ex) {
if (ex instanceof CustomException) {
Result result = ResultUtil.buildFail(ex.getMessage());
return result;
}
return null;
}
}
参考链接: