@ControllerAdvice
- @ControllerAdvice是一个@Component,用于定义@ExceptionHandler,@InitBinder和@ModelAttribute方法,适用于所有使用@RequestMapping方法。
- Spring4之前,@ControllerAdvice在同一调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice支持配置控制器的子集,而默认的行为仍然可以利用。
- 在Spring4中, @ControllerAdvice通过annotations(), basePackageClasses(), basePackages() 方法定制用于选择控制器子集。
@ExceptionHandler
可以对web的服务器端运行错误, 做统一的处理
实现方式
一.定义全局捕获异常
@ControllerAdvice
@ResponseBody
public class GlobalExceptionHandler {
private Logger logger = LoggerFactory.getLogger(GlobalExceptionHandler.class);
public GlobalExceptionHandler() {
}
//ServiceException自定义业务异常
@ExceptionHandler({ServiceException.class})
public BaseResult baseExceptionHandler(HttpServletResponse response, ServiceException ex) {
this.logger.error(ex.getMessage(), ex);
return new BaseResult(ex.getCode(), ex.getMessage());
}
@ExceptionHandler({Exception.class})
public BaseResult otherExceptionHandler(HttpServletResponse response, Exception ex) {
this.logger.error(ex.getMessage(), ex);
return new BaseResult(ResultCode.SERVER_ERROR, ex.getMessage());
}
}
2.定义公共异常。
public class ServiceException extends RuntimeException {
private int code;
public ServiceException() {
this.code = ResultCode.ERROR;
}
public ServiceException(BaseExceptionMsg baseExceptionMsg) {
this(baseExceptionMsg.getExpCode(), baseExceptionMsg.getExpMsg());
}
public ServiceException(int code, String message) {
super(message);
this.code = ResultCode.ERROR;
this.code = code;
}
public ServiceException(String message, Throwable cause, int code) {
super(message, cause);
this.code = ResultCode.ERROR;
this.code = code;
}
public ServiceException(String message) {
super(message);
this.code = ResultCode.ERROR;
}
public ServiceException(String message, Throwable cause) {
super(message, cause);
this.code = ResultCode.ERROR;
}
public ServiceException(Throwable cause) {
super(cause);
this.code = ResultCode.ERROR;
}
public int getCode() {
return this.code;
}
public void setCode(int code) {
this.code = code;
}
}
public interface BaseExceptionMsg {
int getExpCode();
String getExpMsg();
}
3.定义各个系统异常。
public enum DmaServiceExcetionMsg implements BaseExceptionMsg {
QUERY_NODATA(20000,"查询无数据"),
TOKENEXCEPTION(20001,"Token无效或Token已失效"),
NOT_NULL(20002,"为必填字段"),
TO_LONG(20003,"字段太长");
private int code;
private String msg;
DmaServiceExcetionMsg(int code, String msg) {
this.code = code;
this.msg = msg;
}
public int getCode() {
return code;
}
public String getMsg() {
return msg;
}
@Override
public int getExpCode() {
return this.getCode();
}
@Override
public String getExpMsg() {
return this.getMsg();
}
}