一、介紹
- @ControllerAdvice注解是Spring3.2中新增的注解,作用是給Controller控制器添加統(tǒng)一的操作或處理,當(dāng)然包含對(duì)異常的處理。
二、實(shí)現(xiàn)
- 自定義一個(gè)GlobalExceptionHandler,并添加注解@ControllerAdvice(basePackages = {"com.xxx.controller"})
這個(gè)basePackages 表示哪些controller需要這個(gè)GlobalExceptionHandler處理異常。代碼如下:
@ControllerAdvice(basePackages = {"cn.xxx.controller"})
@Slf4j
public class GlobalExceptionHandler {
/**
* 處理全局的異常
*
* @param e
* @return
*/
@ExceptionHandler(HuiXunBaseException.class)
@ResponseBody
WebResponse handleException(HttpServletRequest request, HuiXunBaseException e) {
HashMap<String, Object> data = Maps.newHashMap();
data.put("url", request.getRequestURL().toString());
data.put("params", e.getParams());
log.error("", e);
return WebResponse.getInitWebResponse(e.getStatus(), e.getMessage(), data);
}
}
注意一下,這個(gè)方法(handleException)的參數(shù)。如果有自定的參數(shù)的話,這個(gè)異常的處理方法是不生效的,原因可以自行了解。@ResponseBody表示異常處理的返回給客戶端的結(jié)果是以json字符串的形式處理,當(dāng)然也可以使用其他的形式,比如ModelAndView。
- 自定義的異常代碼:
自定義基類(lèi)異常的代碼:
/**
* @author ww
* @version 1.0
* @Date 2019/12/12
*/
@Data
@NoArgsConstructor
public class HuiXunBaseException extends Exception{
/**
* 響應(yīng)給客戶端的狀態(tài)碼
*/
private int status;
/**
* 異常產(chǎn)生的方法的 參數(shù)
*/
private Object params;
/**
*
* @param msg
*/
public HuiXunBaseException(String msg){
super(msg);
}
public HuiXunBaseException(int status, String msg, Object params){
super(msg);
this.status = status;
this.params = params;
}
}
自定義業(yè)務(wù)異常的代碼:
/**
* @author ww
* @version 1.0
* @Date 2019/12/12
*/
public class BSVBusinessException extends HuiXunBaseException {
/**
* @param status
* @param msg
* @param params
*/
public BSVBusinessException(int status, String msg, Object params) {
super(status, msg, params);
}
}
- 統(tǒng)一響應(yīng)給客戶端的格式代碼:
/**
* @author ww
* @version 1.0
* @Date 2019/5/27
*/
@Data
public class WebResponse<T> {
public static class STATUS {
// 正常
public static final int STATUS_OK = 0;
// 業(yè)務(wù)異常
public static final int BIZ_ERROR = 5;
}
public static class MESSAGE {
public static final String BIZ_ERROR_MESSAGE = "業(yè)務(wù)異常";
}
//請(qǐng)求狀態(tài),0: 正常返回, 1:系統(tǒng)異常, 2:權(quán)限錯(cuò)誤, 3:參數(shù)錯(cuò)誤, 4:業(yè)務(wù)異常
private int status = STATUS.STATUS_OK;
//請(qǐng)求數(shù)據(jù)
private T data;
//錯(cuò)誤碼信息
private String message;
public WebResponse(int status, T data, String message) {
this.status = status;
this.data = data;
this.message = message;
}
public WebResponse() {
}
public <E extends WebResponse> E status(int status) {
setStatus(status);
return (E) this;
}
public <E extends WebResponse> E data(T data) {
setData(data);
return (E) this;
}
public <E extends WebResponse> E message(String message) {
setMessage(message);
return (E) this;
}
/**
* 處理是否成功
*/
public boolean isSuccess() {
return this.status == STATUS.STATUS_OK;
}
public static WebResponse getInitWebResponse(int status, String message, Object data){
WebResponse<Object> webResponse = new WebResponse<>();
webResponse.setStatus(status);
webResponse.setMessage(message);
webResponse.setData(data);
return webResponse;
}
}
- 測(cè)試Controller
/**
* @author ww
* @version 1.0
* @Date 2019/12/12
*/
@RestController
@RequestMapping(value = "/test")
public class TestExceptionController {
/**
* @return
*/
@RequestMapping(value = "/exception", method = RequestMethod.GET)
public WebResponse test(@RequestParam(value = "param") String param) throws HuiXunBaseException {
throw new BSVBusinessException(WebResponse.STATUS.BIZ_ERROR, "發(fā)生異常啦", param);
}
}
-
測(cè)試結(jié)果如下圖:
image.png
