BasicErrorController收集的错误信息包含: error - 错误描述,如: Internal Server Error (服务内部错误) exception - 异常类型, 如: java.lang. ArithmeticException message - 异常描述, 如: / by zero timestamp - 时间戳 status - 响应状态码, 如: 200, 500, 404等
##ExceptionHandler
Spring支持异常的细致化处理,可以在控制器中定义若干方法,专门用于处理异常。处理异常的方法使用注解**@ExceptionHandler**来描述,注解的value属性是Class[]类型,代表该方法可以处理的异常种类。这种异常处理方式力度较细,处理方式多样化。其缺陷是: 如果定义了太多的异常处理方法,会提升维护成本;且异常处理方法只对当前控制器有效。代码有bad smell。这种开发方式适合针对性处理。因为定义在控制器中的异常处理方法处理优先级最高##ControllerAdvice和ExceptionHandler
SpringBoot可以独立定义一个类型作为ControllerAdvice(Controller的一种增强),类型需要使用@ControllerAdvice注解来描述,类型中可以定义若干异常处理方法,且方法使用@ExceptionHandler来描述。当应用中发生异常时,异常的处理顺序是: 当前控制器中定义的@ExceptionHandler方法 -> @ControllerAdvice类中定义的@ExceptionHandler方法 -> BasicErrorController中定义的服务方法(error.html默认异常页面)可以解决异常处理通用性。这种处理异常的方式,需要定义一个Advice类型和若干异常处理方法。 @ControllerAdvice public class ExceptionControllerAdvice { private final static Logger LOGGER = LoggerFactory.getLogger(ExceptionControllerAdvice.class); @ExceptionHandler(BusinessException.class) @ResponseBody public Result<?> handleBusinessException(HttpServletRequest request, Exception e) { return handleException(request, e, false); } @ExceptionHandler(HttpRequestMethodNotSupportedException.class) @ResponseBody public ResponseEntity<Integer> handleMethodNotSupportedException(HttpServletRequest request, Exception e) { return ResponseEntity.badRequest().body(null); } @ExceptionHandler(Exception.class) @ResponseBody public Result<?> handleOtherException(HttpServletRequest request, Exception e) { return handleException(request, e, true); } private Result<?> handleException(HttpServletRequest request, Exception e, boolean logger) { String errMsg = ExceptionUtils.getErrorMessage(e); String strError = StringUtils.isEmpty(errMsg) ? e.getMessage() : errMsg; ResultCode respondCode = ResultCode.get(strError); if (logger) { LOGGER.error(strError, e); e.printStackTrace(); } if (respondCode == null) { return Result.error(strError); } else { return Result.create(respondCode); } } }