妙用CommonException

在开发wawaji项目时,我们有个校验用户身份的逻辑。如果校验成功,返回用户信息;如果用户不存在,返回4001008;如果token失效,返回4001010;如果token不正确,返回4001011。
由于多处逻辑需要校验用户身份,所有我们希望在校验过程中,如果校验失败,直接返回失败结果,程序不再继续执行。
1.编写检验失败返回错误代码及错误提示枚举类:

public enum EnumSystemCode {

    SUCC(2000, "SUCC"),

    ERROR_USER_NOT_EXIST(4001008, "用户不存在"),

    ERROR_TOKEN_TIMEOUT(4001010, "token失效"),

    ERROR_TOKEN(4001011, "token不正确"),   

    COMMON(0, "错误");

    @Getter
    private final int code;
    @Getter
    private final String conent;

    EnumSystemCode(int code, String content) {
        this.code = code;
        this.conent = content;
    }

    public static EnumSystemCode findByCode(int code) {
        for (EnumSystemCode sCode : EnumSystemCode.values()) {
            if (sCode.getCode() == code) {
                return sCode;
            }
        }
        return null;
    }

}

2:编写检验失败抛出的CommonException类:

public class CommonException extends RuntimeException {
    private static final long serialVersionUID = 1L;

    @Getter
    private int code;
    @Getter
    private EnumSystemCode systemCode;

    public CommonException(int code, String msg) {
        super(msg);
        this.code = code;
        this.systemCode = EnumSystemCode.findByCode(code);
    }

    public CommonException(EnumSystemCode systemCode) {
        super(systemCode.getConent());
        this.code = systemCode.getCode();
        this.systemCode = systemCode;
    }

    public CommonException(EnumSystemCode systemCode, String msg) {
        super(msg);
        this.code = systemCode.getCode();
        this.systemCode = systemCode;
    }

    public CommonException(String msg) {
        this(EnumSystemCode.COMMON.getCode(), msg);
    }

    public static CommonException getInstance(String msg, Object... args) {
        for (Object object : args) {
            msg = msg.replaceFirst("\\{\\}", object.toString());
        }
        return new CommonException(msg);
    }

    public static CommonException getInstance(String msg) {
        return new CommonException(msg);
    }

}

3.业务判断时,根据不同情况提示错误信息:

if (code == EnumSystemCode.SUCC.getCode()) {
    //校验成功
} else if (code == EnumSystemCode.ERROR_USER_NOT_EXIST.getCode()) {
    logger.info("用户不存在 , userId:{}", userId);
    throw new CommonException(code, EnumSystemCode.ERROR_USER_NOT_EXIST.getConent());
} else if (code == EnumSystemCode.ERROR_TOKEN_TIMEOUT.getCode()) {
    logger.info("token失效 , userId:{}, token:{}", userId, token);
    throw new CommonException(code, EnumSystemCode.ERROR_TOKEN_TIMEOUT.getConent());
} else if (code == EnumSystemCode.ERROR_TOKEN.getCode()) {
    logger.info("token不正确 , userId:{}, token:{}", userId, token);
    throw new CommonException(code, EnumSystemCode.ERROR_TOKEN.getConent());
}

4.抛出异常后,异常拦截器拦截:

@ControllerAdvice("com.***.web.resource")
public class ResponseAdvice implements ResponseBodyAdvice<Object> {

    @Override
    public boolean supports(MethodParameter methodParameter, Class<? extends HttpMessageConverter<?>> aClass) {
        return true;
    }

    @Override
    public Object beforeBodyWrite(Object o, MethodParameter methodParameter, MediaType mediaType,
            Class<? extends HttpMessageConverter<?>> aClass, ServerHttpRequest serverHttpRequest,
            ServerHttpResponse serverHttpResponse) {
        ServletServerHttpResponse response = (ServletServerHttpResponse) serverHttpResponse;    

        return ApiResponse.builder().status(response.getServletResponse().getStatus()).msg("OK").data(o).build();
    }

    @ExceptionHandler(CommonException.class)
    @ResponseBody
    public ApiResponse<?> handleControllerException(HttpServletRequest request, CommonException e) {
        return ApiResponse.builder().status(e.getCode()).msg(e.getMessage()).build();
    }

    @ExceptionHandler(Exception.class)
    @ResponseBody
    public ApiResponse<?> handleControllerException(HttpServletRequest request, Throwable e) {
        HttpStatus status = getStatus(request);
        return ApiResponse.builder().status(status.value()).msg(e.getMessage()).build();
    }

    private HttpStatus getStatus(HttpServletRequest request) {
        Integer statusCode = (Integer) request.getAttribute("javax.servlet.error.status_code");
        if (statusCode == null) {
            return HttpStatus.INTERNAL_SERVER_ERROR;
        }
        return HttpStatus.valueOf(statusCode);
    }
}

通过上述配置,我们便实现了一旦校验失败,程序中止执行,立刻返回错误代码的效果。

  • 0
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 1
    评论
评论 1
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值