Spring Bootグローバル例外の処理方法


1.インタフェース統一返却基準の定義
import io.swagger.annotations.ApiModel;
import io.swagger.annotations.ApiModelProperty;
import lombok.Getter;
import lombok.Setter;
import java.io.Serializable;
@ApiModel(value = "        ")
@Getter
@Setter
public class ResultMsg implements Serializable {
    @ApiModelProperty(value = "   ")
    private int code;
    @ApiModelProperty(value = "      ")
    private String msg;
    @ApiModelProperty(value = "    ")
    private Object data;
    public ResultMsg(ResultMsgStatus resultMsgStatus) {
        this.code = resultMsgStatus.getCode();
        this.msg = resultMsgStatus.getMsg();
    }
    public ResultMsg(ResultMsgStatus resultMsgStatus, Object data) {
        this.code = resultMsgStatus.getCode();
        this.msg = resultMsgStatus.getMsg();
        this.data = data;
    }
    private ResultMsg setMsg(String msg) {
        this.msg = msg;
        return this;
    }
    public static ResultMsg success(Object data) {
        return new ResultMsg(ResultMsgStatus.SUCCESS, data);
    }
    public static ResultMsg success() {
        return new ResultMsg(ResultMsgStatus.SUCCESS, "");
    }
    public static ResultMsg failure(String failMsg) {
        return new ResultMsg(ResultMsgStatus.FAILURE).setMsg(failMsg);
    }
}

2.エラーコードの定義
import lombok.Getter;
@Getter
public enum ResultMsgStatus {
    /**
     *     
     */
    FAILURE(0, "    "),
    /**
     *     
     */
    SUCCESS(200, "  "),
    /**
     * Token  
     */
    TOKEN_INVALID(401, "Token  "),
    /**
     *      
     */
    SERVER_ERROR(500, "     ");
    private int code;
    private String msg;
    private ResultMsgStatus(int code, String msg) {
        this.code = code;
        this.msg = msg;
    }
}

3.例外ベースクラスの定義
import com.bubble.salt.msg.ResultMsgStatus;
/**
 *     ,                 
 */
public class BaseException extends RuntimeException{
    /**
     *      
     */
    private int code=0;
    public BaseException(ResultMsgStatus status, Throwable cause) {
        super(status.getMsg(), cause);
        this.code=status.getCode();
    }
    public BaseException(ResultMsgStatus status) {
        super(status.getMsg());
        this.code=code;
    }
    public BaseException(String msg){
        super(msg);
        this.code = ResultMsgStatus.FAILURE.getCode();
    }
    public BaseException(ResultMsgStatus status, String msg){
        super(msg);
        this.code = status.getCode();
    }
    public int getCode() {
        return code;
    }
    protected void setCode(int code){
        this.code=code;
    }
}

4.カスタム例外
import com.bubble.salt.msg.ResultMsgStatus;
/**
 * @BelongsPackage: com.bubble.salt.exception
 * @CreateTime: 2019-09-19 16:24
 * @Description:     
 */
public class UserException extends BaseException {
    public UserException(ResultMsgStatus status, Throwable cause) {
        super(status, cause);
    }
    public UserException(ResultMsgStatus status) {
        super(status);
    }
    public UserException(String msg) {
        super(msg);
    }
    public UserException(ResultMsgStatus status, String msg) {
        super(status, msg);
    }
}

5.グローバル異常処理
import com.bubble.salt.msg.ResultMsg;
import com.bubble.salt.msg.ResultMsgStatus;
import lombok.extern.slf4j.Slf4j;
import org.springframework.web.bind.annotation.ExceptionHandler;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestControllerAdvice;
@Slf4j
@RestControllerAdvice
public class GlobalExceptionHandler {
    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ResultMsg globalException(Exception e) {
        log.warn(e.getMessage(), e);
        //                   
        if (e instanceof UserException) {
            return new ResultMsg(ResultMsgStatus.TOKEN_INVALID, e.getMessage());
        }
        return ResultMsg.failure("       !");
    }
}