美文网首页
Spring boot 通用代码

Spring boot 通用代码

作者: 黑曼巴yk | 来源:发表于2020-09-18 22:06 被阅读0次

    统一返回数据

    @Data
    @NoArgsConstructor
    @Accessors(chain = true)
    public class Result<T> implements Serializable {
    
        private static final long serialVersionUID = -1014694272825898751L;
    
        private String message;
    
        private String code;
    
        private Boolean success;
    
        private T data;
    
        private String requestId;
    
        /**
         * 包含错误信息的返回值
         *
         * @param msg
         * @return
         */
        public static Result ofError(String msg) {
            return of(msg, ResultEnum.ERROR.getCode(), null, false);
        }
    
        /**
         * 包含错误信息的返回值
         *
         * @param msg
         * @return
         */
        public static Result ofError(String msg, String traceId) {
            return of(msg, ResultEnum.ERROR.getCode(), null, false, traceId);
        }
    
        /**
         * 包含错误信息的返回值
         *
         * @param msg
         * @return
         */
        public static Result ofError(String msg, String code, String traceId) {
            return of(msg, code, null, false, traceId);
        }
    
        /**
         * 构建一个包含正确元素的返回值
         *
         * @param data
         * @return
         */
        public static <T> Result<T> ofSuccess(T data) {
            return of(null, ResultEnum.SUCCESS.getCode(), data, true);
        }
    
        public static <T> Result<T> ofSuccess(T data, String traceId) {
            return of(null, ResultEnum.SUCCESS.getCode(), data, true, traceId);
        }
    
        /**
         * 构建一个包含正确元素的返回值
         *
         * @param data
         * @param code
         * @return
         */
        public static <T> Result<T> ofSuccess(String code, T data) {
            return of(null, code, data, true);
        }
    
        /**
         * 自定义一个完整的返回结构
         *
         * @param msg
         * @param code
         * @return
         */
        public static <T> Result<T> of(String msg, String code, T data, Boolean success) {
            Result result = new Result();
            result.setMessage(msg)
                    .setSuccess(success)
                    .setData(data)
                    .setCode(code);
            return result;
        }
    
        /**
         * 自定义一个完整的返回结构
         *
         * @param msg
         * @param code
         * @return
         */
        public static <T> Result<T> of(String msg, String code, T data, Boolean success, String requestId) {
            Result result = of(msg, code, data, success).setRequestId(requestId);
            return result;
        }
    }
    

    跟踪traceId

    traceId放在context中

    public class MambaContext {
        private final static ThreadLocal<Map> MAMBA_THREAD_LOCAL = ThreadLocal.withInitial(() -> new HashMap<String, String>(8));
        private static final String TRACE_ID = "traceId";
    
        public static void init(HttpServletRequest request) {
            MAMBA_THREAD_LOCAL.remove();
            initEagleEye();
        }
    
        public static void destory(HttpServletRequest request) {
            MAMBA_THREAD_LOCAL.remove();
        }
    
        public static String getTraceId() {
            return (String) MAMBA_THREAD_LOCAL.get().get(TRACE_ID);
        }
    
        public static void initEagleEye() {
            MAMBA_THREAD_LOCAL.get().putIfAbsent(TRACE_ID,Trace.getTraceId());
        }
    }
    

    使用HandlerInterceptorAdapter进行AOP处理

    @Component
    public class MambaInterceptor extends HandlerInterceptorAdapter {
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            MambaContext.init(request);
            return super.preHandle(request, response, handler);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            MambaContext.destory(request);
            super.afterCompletion(request, response, handler, ex);
        }
    
        @Override
        public void afterConcurrentHandlingStarted(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            MambaContext.destory(request);
            super.afterConcurrentHandlingStarted(request, response, handler);
        }
    }
    

    通用异常处理

    @RestControllerAdvice
    public class ApiExceptionHandler {
        /**
         * 返回 Header application/json;charset=UTF-8 格式
         */
        private final static MultiValueMap<String, String> EXCEPTION_HEADERS = new HttpHeaders() {{
            put("Content-Type", new ArrayList<String>(1) {{
                add(MediaType.APPLICATION_JSON_UTF8_VALUE);
            }});
        }};
    
        @ExceptionHandler(value = Exception.class)
        public ResponseEntity<Result> exceptionHandler(Exception e) {
            String traceId = MambaContext.getTraceId();
            log.error("TraceId: {}, errorMessage: {}, ", traceId, e.getMessage());
            e.printStackTrace();
            Result erroResult = null;
    
            if (e instanceof MambaExceptionInterface) {
                MambaExceptionInterface exception = (MambaExceptionInterface) e;
                erroResult = Result.ofError(
                        exception.getResultCode().getDescription(),
                        exception.getResultCode().getCode(),
                        traceId
                );
            } else {
                erroResult = Result.ofError(
                        ResultEnum.ERROR.getDescription(),
                        ResultEnum.ERROR.getCode(),
                        traceId
                );
            }
    
            return new ResponseEntity<>(
                    erroResult,
                    EXCEPTION_HEADERS,
                    HttpStatus.OK
            );
        }
    }
    

    相关文章

      网友评论

          本文标题:Spring boot 通用代码

          本文链接:https://www.haomeiwen.com/subject/hfdsyktx.html