@RestControllerAdvice与@ControllerAdvice的区别
在学习Java全局异常处理时发现,有的自定义全局异常处理类加@RestControllerAdvice注解而有的自定义类加@ControllerAdvice注解,实际上两者与@Controller、@RestController有点类似。
@RestController 里面包含了@Controller、@ResponseBody 、 而 @RestControllerAdvice 里面也是包含了@ControllerAdvice 、@ResponseBody
@RestControllerAdvice与@ControllerAdvice使用上的区别如下
两者区别就是在方法体上面明显就是少了@ResponseBody
这是使用@ControllerAdvice 的代码
/**
* 统一处理异常通知类
* @author Aaron(谢胜瑜)
*/
@ControllerAdvice
@Slf4j
public class BaseExceptionHandler {
/**
* 处理自定义业务异常
* @param serviceException
* @return
*/
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST)// 设置返回的http status 状态码
@ResponseBody
public R exceptionHandler (ServiceException serviceException) {
// 打印异常日志并输出错误代码定位
log.error("业务异常", serviceException);
return R.error(serviceException.getStatus(), serviceException.getMessage());
}
}
这是使用@RestControllerAdvice 的代码
/**
* 统一处理异常通知类
* @author Aaron(谢胜瑜)
*/
@RestControllerAdvice
@Slf4j
public class BaseExceptionHandler {
/**
* 处理自定义业务异常
* @param serviceException
* @return
*/
@ExceptionHandler(ServiceException.class)
@ResponseStatus(HttpStatus.BAD_REQUEST) // 设置返回的http status 状态码
public R exceptionHandler (ServiceException serviceException) {
// 打印异常日志并输出错误代码定位
log.error("业务异常", serviceException);
return R.error(serviceException.getStatus(), serviceException.getMessage());
}
}
遇到的问题
当你使用的是@ControllerAdvice 然而方法体上面没加@ResponseBody就会遇到一个奇怪的问题
异常处理类已经捕获该报错但是 http 响应 无论是 status 还是 body 都是 404 、 Not Found
暂时没研究出来什么原因换成@RestControllerAdvice、或者在方法上加上@ResponseBody就好了