package com.miu.web.configuration;

import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.validation.BindException;
import org.springframework.web.bind.annotation.ControllerAdvice;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;

/**
*/
@ControllerAdvice
public class ExceptionConfig {

private final Logger log = LoggerFactory.getLogger(ExceptionConfig.class);

/**
* 处理业务异常
*
* @param ex
* @return
*/
@ExceptionHandler(BaseException.class)
@ResponseBody
public Object handleMallException(BaseException ex) {
log.error("统一处理系统异常-业务异常:", ex);
return Result.error(ex.getMessage(), ex.getStatus().toString());
}

/**
* 处理业务异常
*
* @param ex 异常
* @return Object
*/
@ExceptionHandler(BindException.class)
@ResponseBody
public Object handleMallException(BindException ex) {
log.error("统一处理系统异常-业务参数校验异常:", ex);
return new Result<>(ex.getFieldError().getDefaultMessage(), String.valueOf(ResponseStatus.PARAMETER_ILLEGAL.getCode()), false, "");
}

/**
* 处理业务异常
*
* @param ex 异常
* @return Object
*/
@ExceptionHandler(BusinessValidateException.class)
@ResponseBody
public Object handleMallException(BusinessValidateException ex) {
log.error("统一处理系统异常-业务校验异常:", ex);
return new Result<>(ex.getMessage(), String.valueOf(ex.getStatus().getCode()), false, "");
}

/**
* 处理系统异常
*
* @param ex
* @return
*/
@ExceptionHandler(Exception.class)
@ResponseBody
public Object handleException(Exception ex) {
log.error("统一处理系统异常-报错信息为:", ex);
return Result.error("system","system");
}
}

先用@ControllerAdvice搭配@ExceptionHandler来使用,捕获全局异常。

/**
* 自定义异常
*
*/
public class BaseException extends RuntimeException {
//状态码
private ResponseStatus status = ResponseStatus.UNKNOWN_ERROR;
//附加信息
private String additionMsg = "";

public BaseException(ResponseStatus status, String additionMsg){
super(String.format(status.getMessageFormat(),additionMsg));
this.status = status;
this.additionMsg = additionMsg;
}

public BaseException(ResponseStatus status){
super(String.format(status.getMessageFormat(),""));
this.status = status;
}

public BaseException(String additionMsg){
super(String.format(ResponseStatus.UNKNOWN_ERROR.getMessageFormat(),additionMsg));
this.additionMsg = additionMsg;
}

public ResponseStatus getStatus() {
return status;
}

public void setStatus(ResponseStatus status) {
this.status = status;
}

public String getAdditionMsg() {
return additionMsg;
}

public void setAdditionMsg(String additionMsg) {
this.additionMsg = additionMsg;
}
}
/**
* @date 2022-10-31 15:01
*/
public class BusinessValidateException extends BaseException {

/**
* 状态码
*/
private ResponseStatus status = ResponseStatus.UNKNOWN_ERROR;

/**
* 附加信息
*/
private String additionMsg = "";

public BusinessValidateException(ResponseStatus status, String additionMsg) {
super(String.format(status.getMessageFormat(), additionMsg));
this.status = status;
this.additionMsg = additionMsg;
}

public BusinessValidateException(ResponseStatus status) {
super(String.format(status.getMessageFormat(), ""));
this.status = status;
}

public BusinessValidateException(String additionMsg) {
super(String.format(ResponseStatus.UNKNOWN_ERROR.getMessageFormat(), additionMsg));
this.additionMsg = additionMsg;
}

public static void throwException(ResponseStatus status) {
throw new BaseException(status);
}

public static void throwException(String additionMsg) {
throw new BaseException(additionMsg);
}

public static void throwException(ResponseStatus status, String additionMsg) {
throw new BaseException(status, additionMsg);
}

public ResponseStatus getStatus() {
return status;
}

public void setStatus(ResponseStatus status) {
this.status = status;
}

public String getAdditionMsg() {
return additionMsg;
}

public void setAdditionMsg(String additionMsg) {
this.additionMsg = additionMsg;
}
}
/**
* @author
*/
public enum ResponseStatus {
SUCCESS(200, "成功"),
TOKEN_INVALID(10401, "令牌无效"),
SIGN_INVALID(10402, "签名不匹配"),
UNAUTHORIZED(20001, "资源未授权:请刷新页面后重试"),
PARAMETER_ILLEGAL(30001, "参数不合法:%s"),
REQUEST_ERROR(30002, "请求失败:%s"),
BUSINESS_PARAM_ERROR(30003, "%s"),
UNKNOWN_ERROR(40001, "%s"),

RPC_ERROR(50001, "服务返回异常:%s"),
BUSINESS_EXCEPTION(60001, "业务异常:%s"),

STOCK_STATUS_SEND_ERROR(60002, "发件扫描库存状态异常"),
STOCK_STATUS_ARRIVE_ERROR(60003, "到件扫描库存状态异常"),

;


private int code;
private String messageFormat;

ResponseStatus(int code, String messageFormat) {
this.code = code;
this.messageFormat = messageFormat;
}

public int getCode() {
return code;
}

public void setCode(int code) {
this.code = code;
}

public String getMessageFormat() {
return messageFormat;
}

public void setMessageFormat(String messageFormat) {
this.messageFormat = messageFormat;
}
}