一、介绍
- @ControllerAdvice注解是Spring3.2中新增的注解,作用是给Controller控制器添加统一的操作或处理,当然包含对异常的处理。
二、实现
- 自定义一个GlobalExceptionHandler,并添加注解@ControllerAdvice(basePackages = {"com.xxx.controller"})
这个basePackages 表示哪些controller需要这个GlobalExceptionHandler处理异常。代码如下:
@ControllerAdvice(basePackages = {"cn.xxx.controller"})
@Slf4j
public class GlobalExceptionHandler {
/**
* 处理全局的异常
*
* @param e
* @return
*/
@ExceptionHandler(HuiXunBaseException.class)
@ResponseBody
WebResponse handleException(HttpServletRequest request, HuiXunBaseException e) {
HashMap 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);
}
}
注意一下,这个方法(handleException)的参数。如果有自定的参数的话,这个异常的处理方法是不生效的,原因可以自行了解。@ResponseBody表示异常处理的返回给客户端的结果是以json字符串的形式处理,当然也可以使用其他的形式,比如ModelAndView。
- 自定义的异常代码:
自定义基类异常的代码:
/**
* @author ww
* @version 1.0
* @Date 2019/12/12
*/
@Data
@NoArgsConstructor
public class HuiXunBaseException extends Exception{
/**
* 响应给客户端的状态码
*/
private int status;
/**
* 异常产生的方法的 参数
*/
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;
}
}
自定义业务异常的代码:
/**
* @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);
}
}
- 统一响应给客户端的格式代码:
/**
* @author ww
* @version 1.0
* @Date 2019/5/27
*/
@Data
public class WebResponse {
public static class STATUS {
// 正常
public static final int STATUS_OK = 0;
// 业务异常
public static final int BIZ_ERROR = 5;
}
public static class MESSAGE {
public static final String BIZ_ERROR_MESSAGE = "业务异常";
}
//请求状态,0: 正常返回, 1:系统异常, 2:权限错误, 3:参数错误, 4:业务异常
private int status = STATUS.STATUS_OK;
//请求数据
private T data;
//错误码信息
private String message;
public WebResponse(int status, T data, String message) {
this.status = status;
this.data = data;
this.message = message;
}
public WebResponse() {
}
public E status(int status) {
setStatus(status);
return (E) this;
}
public E data(T data) {
setData(data);
return (E) this;
}
public 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
- 测试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, "发生异常啦", param);
}
}
-
测试结果如下图: