java捕获全局异常
-
@ControllerAdvice
是一个@Component
,用于定义@ExceptionHandler
,@InitBinder
和@ModelAttribute
方法,适用于所有使用@RequestMapping
方法。 -
Spring4之前,
@ControllerAdvice
在同一调度的Servlet中协助所有控制器。Spring4已经改变:@ControllerAdvice
支持配置控制器的子集,而默认的行为仍然可以利用。 -
在Spring4中,
@ControllerAdvice
通过annotations()
,basePackageClasses()
,basePackages()
方法定制用于选择控制器子集。
不过据经验之谈,只有配合@ExceptionHandler
最有用,其它两个不常用。
@ControllerAdvice用来处理异常
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import java.util.HashMap;
import java.util.Map;
@ControllerAdvice
public class ControllerAdvice {
private static final Logger log = LoggerFactory.getLogger(RuleMappingAdapterImpl.class);
/**
* 全局异常捕捉处理
*
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = Exception.class)
public Map<String, Object> errorHandler(Exception ex) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", Constant.ExeceptionCode.E_500);
map.put("msg", ex.getMessage());
log.error("捕捉到全局异常(Exception),msg:{}", map.get("msg"), ex);
return map;
}
/**
* 拦截捕捉自定义异常 MyException.class
*
* @param ex
* @return
*/
@ResponseBody
@ExceptionHandler(value = CException.class)
public Map<String, Object> myErrorHandler(CException ex) {
Map<String, Object> map = new HashMap<String, Object>();
map.put("code", ex.getCode());
map.put("msg", ex.getMsg());
if(ex.getContext() == null ){
map.put("class", "");
}else {
map.put("class", ex.getContext().getClass().getName());
}
log.error("捕捉到全局异常(CntenException),msg:{}", map.get("msg"), ex.getExe());
return map;
}
}
public class Constant {
public static class ExeceptionCode {
public static int E_500 = 500;// 系统异常
public static int E_200 = 200;// 正常访问
public static int E_403 = 403;// 资源无权访问
public static int E_401 = 401;// 用户验证失败
/**
* 各自模块自己定义
*/
}
}
public class CException extends RuntimeException {
private static final long serialVersionUID = -1433777525759711883L;
public CException(Object context, String code, String msg) {
this.code = code;
this.msg = msg;
this.context = context;
}
public CException(Object context, String code, String msg, Exception exe) {
this.code = code;
this.msg = msg;
this.context = context;
this.exe = exe;
}
private Object context;
private String code;
private String msg;
private Exception exe;
public Object getContext() {
return context;
}
public void setContext(Object context) {
this.context = context;
}
public String getCode() {
return code;
}
public void setCode(String code) {
this.code = code;
}
public String getMsg() {
return msg;
}
public void setMsg(String msg) {
this.msg = msg;
}
public Exception getExe() {
return exe;
}
public void setExe(Exception exe) {
this.exe = exe;
}
}