最近写代码的时候发现一个问题,就是自己定义的异常处理类,在抛出异常后,接口的响应中无法输出自定义的一些提示信息。之后笔者查了一些资料后,总结了一下原因和解决办法,在此记录一下。
一、无法抛出指定异常信息的原因
因为自定义的异常处理类,并没有对响应数据进行处理,仍旧使用的是原Excepiton中的响应格式。
二、解决办法
解决办法很简单,就是对全局的异常响应数据做统一的处理即可得到想要返回的异常信息数据格式,如下方代码:
/**
* 全局异常处理器
*
* @author muyichen
* @version 1.0
* @date 2021/8/4 4:21 下午
*/
@Slf4j
@ControllerAdvice
public class GlobalExceptionHandler {
@ExceptionHandler(ErrorException.class)
@ResponseBody
public ResponseEntity<Object> errorExceptionHandler(ErrorException e) {
CommonResult<ResultCode> result = new CommonResult<>(e.getCode(), e.getMessage());
return new ResponseEntity<>(result, HttpStatus.OK);
}
}
其中
CommonResult
是统一的返回数据格式类型,ResultCode
是异常的枚举类型,都可以用自己定义的去替换。
- 注意:
@ControllerAdvice
该注解是Controller增强注解,它会作用与所有action接口
三、@ControllerAdvice使用过程中遇到的问题
如果将该异常处理类放到公共包中,那么将公共包打包后再引用的话,全局异常处理逻辑将无法生效。
1、造成该问题的原因
全局异常处理类,未被spring容器扫描到(即处理类对象没有注册到容器中),导致无法使用。
2、解决办法
在启动类添加额外的扫包路径,如下:
@SpringBootApplication(scanBasePackages = {"com.muyichen.searcher", "com.muyichen.common"})