妙用CommonException
来源:互联网 发布:spring web flow 知乎 编辑:程序博客网 时间:2024/05/29 15:55
在开发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 0
- 妙用CommonException
- 视图妙用
- JavaScript妙用
- typedef 妙用
- 妙用HttpHandler
- Hander妙用
- #pragma 妙用
- /()/的妙用
- union妙用
- ShellExecute 妙用
- 妙用 Lightbox
- MessageFormat妙用
- 递归妙用
- PsSetCreateProcessNotifyRoutine妙用
- SendMessage妙用
- chkds妙用
- getopt 妙用
- ${}的妙用
- CSS3-转换之perspective
- VS2010下使用QT环境配置
- 好文
- 编程思想之多线程与多进程(2)——线程优先级与线程安全
- untiy去掉所有烦人的warning
- 妙用CommonException
- vue.js 定时器
- 整合Spring时Service层为什么不做全局包扫描详解
- js 中使用indexOf()方法是提示(对象不支持此属性或方法)如何解决?
- python 单元测试与测试用例
- hibernate 中的Inverse Cascade
- Xcode 最新安装插件方案
- Java爬虫框架WebMagic的使用总结
- Java类加载