前言
在前后端开发中,后端接口返回的数据都是JSON格式的,但是后端可能会出现一些可以未知从异常,在后端抛出这些异常的时候,也需要返回相同格式的JSON数据,这时候就需要我们设置全局异常处理器。在后端开发中,需要对一些条件做判断,也可以抛出自定义的异常。话不多说,直接上代码
代码
- 自定义异常
/** * 业务异常 */
public final class ServiceException extends RuntimeException {
private static final long serialVersionUID = 1L;
/** * 错误码 */
private Integer code;
/** * 错误提示 */
private String message;
/** * 错误明细,内部调试错误 * <p> * 和 {CommonResult # getDetailMessage()} 一致的设计 */
private String detailMessage;
/** * 空构造方法,避免反序列化问题 */
public ServiceException() {
}
public ServiceException(String message) {
this.message = message;
}
public ServiceException(String message, Integer code) {
this.message = message;
this.code = code;
}
public String getDetailMessage() {
return detailMessage;
}
@Override
public String getMessage() {
return message;
}
public Integer getCode() {
return code;
}
public ServiceException setMessage(String message) {
this.message = message;
return this;
}
public ServiceException setDetailMessage(String detailMessage) {
this.detailMessage = detailMessage;
return this;
}
}
- 定义全局异常处理
import com.juxin.insureclient.common.domain.AjaxResult;
import com.juxin.insureclient.common.utils.StringUtils;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.HttpRequestMethodNotSupportedException;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.RestControllerAdvice;
import javax.servlet.http.HttpServletRequest;
/** * 全局异常处理器 */
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
/** * 请求方式不支持 */
@ExceptionHandler(HttpRequestMethodNotSupportedException.class)
public AjaxResult handleHttpRequestMethodNotSupported(HttpRequestMethodNotSupportedException e,
HttpServletRequest request)
{
String requestURI = request.getRequestURI();
log.error("请求地址'{}',不支持'{}'请求", requestURI, e.getMethod());
return AjaxResult.error(e.getMessage());
}
/** * 业务异常 */
@ExceptionHandler(ServiceException.class)
public AjaxResult handleServiceException(ServiceException e, HttpServletRequest request)
{
log.error(e.getMessage(), e);
Integer code = e.getCode();
return StringUtils.isNotNull(code) ? AjaxResult.error(code, e.getMessage()) : AjaxResult.error(e.getMessage());
}
/** * 拦截未知的运行时异常 */
@ExceptionHandler(RuntimeException.class)
public AjaxResult handleRuntimeException(RuntimeException e, HttpServletRequest request)
{
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生未知异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
}
/** * 系统异常 */
@ExceptionHandler(Exception.class)
public AjaxResult handleException(Exception e, HttpServletRequest request)
{
String requestURI = request.getRequestURI();
log.error("请求地址'{}',发生系统异常.", requestURI, e);
return AjaxResult.error(e.getMessage());
}
}
3.返回消息格式
import com.juxin.insureclient.common.constant.HttpStatus;
import com.juxin.insureclient.common.utils.StringUtils;
import java.util.HashMap;
/** * 操作消息提醒 */
public class AjaxResult extends HashMap<String, Object> {
private static final long serialVersionUID = 1L;
/** * 状态码 */
public static final String CODE_TAG = "code";
/** * 返回内容 */
public static final String MSG_TAG = "msg";
/** * 数据对象 */
public static final String DATA_TAG = "data";
/** * 初始化一个新创建的 AjaxResult 对象,使其表示一个空消息。 */
public AjaxResult() {
}
/** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 */
public AjaxResult(int code, String msg) {
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
}
/** * 初始化一个新创建的 AjaxResult 对象 * * @param code 状态码 * @param msg 返回内容 * @param data 数据对象 */
public AjaxResult(int code, String msg, Object data) {
super.put(CODE_TAG, code);
super.put(MSG_TAG, msg);
if (StringUtils.isNotNull(data)) {
super.put(DATA_TAG, data);
}
}
/** * 返回成功消息 * * @return 成功消息 */
public static AjaxResult success() {
return AjaxResult.success("操作成功");
}
/** * 返回成功数据 * * @return 成功消息 */
public static AjaxResult success(Object data) {
return AjaxResult.success("操作成功", data);
}
/** * 返回成功消息 * * @param msg 返回内容 * @return 成功消息 */
public static AjaxResult success(String msg) {
return AjaxResult.success(msg, null);
}
/** * 返回成功消息 * * @param msg 返回内容 * @param data 数据对象 * @return 成功消息 */
public static AjaxResult success(String msg, Object data) {
return new AjaxResult(HttpStatus.SUCCESS, msg, data);
}
/** * 返回警告消息 * * @param msg 返回内容 * @return 警告消息 */
public static AjaxResult warn(String msg) {
return AjaxResult.warn(msg, null);
}
/** * 返回警告消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */
public static AjaxResult warn(String msg, Object data) {
return new AjaxResult(HttpStatus.WARN, msg, data);
}
/** * 返回错误消息 * * @return */
public static AjaxResult error() {
return AjaxResult.error("操作失败");
}
/** * 返回错误消息 * * @param msg 返回内容 * @return 警告消息 */
public static AjaxResult error(String msg) {
return AjaxResult.error(msg, null);
}
/** * 返回错误消息 * * @param msg 返回内容 * @param data 数据对象 * @return 警告消息 */
public static AjaxResult error(String msg, Object data) {
return new AjaxResult(HttpStatus.ERROR, msg, data);
}
/** * 返回错误消息 * * @param code 状态码 * @param msg 返回内容 * @return 警告消息 */
public static AjaxResult error(int code, String msg) {
return new AjaxResult(code, msg, null);
}
/** * 链式调用 * * @param key 键 * @param value 内容 * @return 警告消息 */
@Override
public AjaxResult put(String key, Object value) {
super.put(key, value);
return this;
}
}
965

被折叠的 条评论
为什么被折叠?



