SpringBoot定义全局统⼀业务异常,且处理filter⾥⾯的异常定义统⼀异常类:BusinessException.java
package com.miaoying;
import lombok.Data;
@Data
public class BusinessException extends RuntimeException {
/**
* 错误码
*/
private Integer code;
/**
* 错误信息
*/
private String message;
public BusinessException(Integer code, String message) {
super(message);
}
@Override
public boolean equals(Object o) {
if (this == o) return true;
if (o == null || getClass() != o.getClass()) return false;
BusinessException that = (BusinessException) o;
if (!code.de)) return false;
return message.ssage);
}
@Override
public int hashCode() {
int result = code != null ? code.hashCode() : 0;
result = 31 * result + (message != null ? message.hashCode() : 0);
return result;
}
}
定义统⼀的数据返回的结构:ResultResponse<T>.java
package com.miaoying;
import lombok.AllArgsConstructor;
import lombok.Data;
import lombok.NoArgsConstructor;
import java.io.Serializable;
@Data
@AllArgsConstructor
@NoArgsConstructor
public class ResultResponse<T> implements Serializable {
private static final long serialVersionUID = 5261844042861308860L;
private int retCode;
private String retMsg;
private T rsp;
public static <T> ResultResponse<T> wrapSuccessfulResult(T data) {
ResultResponse<T> result = new ResultResponse<T>();
result.rsp = data;
return result;
}
}
定义异常:BusinessExceptionFilter.java
package com.miaoying
import com.miaoying.BusinessException;
import com.miaoying.ResultResponse;
import com.alibaba.fastjson.JSONObject;
slf4j.Slf4j;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import javax.servlet.http.HttpServletRequest;
@ControllerAdvice
@Slf4j
public class BusinessExceptionFilter {
@ExceptionHandler(BusinessException.class)
@ResponseBody
public Object handleBusinessException(HttpServletRequest request, BusinessException ex) {
<("BusinessException code:{},msg:{}", ex.getCode(), ex.getMessage());
ResultResponse response = new Code(), ex.getMessage(), null);
JSON(response);
}
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handleException(HttpServletRequest request, Exception ex) {
<("Exception code:{},msg:{}", 500, ex.getMessage());
ResultResponse response = new ResultResponse(500, "⽬前业务繁忙,请您稍后!", null);
JSON(response);
}
}
在需要⾃定义异常的地⽅可以直接以如下形式抛出:
throw new BusinessException(503, "异常测试");
可以将错误码、错误信息统⼀管理成常量,总之,还有优化的空间~
使⽤上述⽅式,对filter⾥抛出的异常捕获不到,所以需要额外处理,如下所⽰:
@Component
@Slf4j
public class RequestFilter implements Filter {
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String path = ((HttpServletRequest) servletRequest).getRequestURI();
if (ains("/exception")) {
throw new BusinessException(401, "filter内部抛出异常");
}
filterChain.doFilter(servletRequest, servletResponse);
}
}
如上代码所⽰的filter⾥⾯抛出异常,是不会转换为BusinessException的,⽽是直接抛出:
所以我采取了⼀个⽐较low的⽅式:直接向页⾯response出⽂字内容(据说可以采⽤Order改变类的执⾏顺序,进⾏异常捕获,但我还没尝试过):
@Override
public void doFilter(ServletRequest servletRequest, ServletResponse servletResponse, FilterChain filterChain) throws IOException, ServletException {
String path = ((HttpServletRequest) servletRequest).getRequestURI();
try {
if (ains("/exception")) {
throw new BusinessException(401, "filter内部抛出异常");
}
filterChain.doFilter(servletRequest, servletResponse);
return;
} catch (Exception e) {
<(e.getMessage());
ResultResponse response = new ResultResponse();
if (e instanceof BusinessException) {
BusinessException be = (BusinessException) e;
response.Code());
response.Message());
} else {
response.setRetCode(500);
response.Message());
springboot和过滤器}
servletResponse.setCharacterEncoding("utf-8");
return;
}
}
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论