• 异常校验处理


    本文旨在提供业务访问的高效性,针对异常校验进行新的思路规划设计:

         先校验正常的业务流程,不匹配再走异常,而不是一开始就校验异常(提高80%效率)

    适用于:业务异常校验场景

    8-2定律:业务中80%以上的场景都是正常的,剩余20%可能需要考虑异常

    例如:国际业务中,校验到方  洲/省  城市   邮编

    传统校验,从上到下:

    提示1:到方洲/省份不对,提示洲/省份错误

    提示1:如果城市不正确,提示城市错误

    提示2:如果邮编不正确,提示邮编错误

    改进异常校验:先校验正确业务场景,不匹配再逐层走异常校验逻辑  即

    1.洲/省  +城市 +  邮编  有,走正常逻辑,异常走

    2.城市 +  邮编  有,走正常逻辑,异常走;提示异常信息

    3.邮编  有,走正常逻辑,异常走;提示异常信息

    对于异常可以使用优雅的AOP思想返回异常信息处理;需要的异常自定义定义

    1. import com.system.entity.BusinessException;
    2. import org.springframework.stereotype.Component;
    3. import org.springframework.web.bind.annotation.ControllerAdvice;
    4. import org.springframework.web.bind.annotation.ExceptionHandler;
    5. import org.springframework.web.servlet.ModelAndView;
    6. import org.springframework.web.servlet.view.json.MappingJackson2JsonView;
    7. import javax.servlet.http.HttpServletRequest;
    8. import javax.servlet.http.HttpServletResponse;
    9. import java.util.HashMap;
    10. import java.util.Map;
    11. import java.util.Objects;
    12. /**
    13. * description:
    14. */
    15. @Component
    16. @ControllerAdvice
    17. public class GlobalExceptionAdvice {
    18. @ExceptionHandler
    19. public ModelAndView resolveException(HttpServletRequest request, HttpServletResponse response, Exception e) {
    20. ModelAndView modelAndView = new ModelAndView();
    21. MappingJackson2JsonView mappingJackson2JsonView = new MappingJackson2JsonView();
    22. Map hashMap = new HashMap<>();
    23. if (Objects.nonNull(e)) {
    24. if (e instanceof BusinessException) {
    25. BusinessException e1 = (BusinessException) e;
    26. hashMap.put("code", e1.getCode());
    27. hashMap.put("success", false);
    28. hashMap.put("msg", e1.getMsg());
    29. }
    30. if (e instanceof IllegalArgumentException) {
    31. IllegalArgumentException e1 = (IllegalArgumentException) e;
    32. hashMap.put("code", 400);
    33. hashMap.put("success", false);
    34. hashMap.put("msg", e1.getMessage());
    35. } else {
    36. hashMap.put("code", 500);
    37. hashMap.put("success", false);
    38. hashMap.put("msg", e.getMessage());
    39. }
    40. }
    41. modelAndView.addAllObjects(hashMap);
    42. modelAndView.setView(mappingJackson2JsonView);
    43. return modelAndView;
    44. }
    45. }
    import lombok.Data;
    
    /**
     * description:
     */
    @Data
    public class BusinessException extends RuntimeException{
        private int code;
        private int msg;
    }

    如果需要自定义注解场景可以使用拦截器处理方案

    步骤1:自定义注解

    import java.lang.annotation.*;
    
    @Target(ElementType.METHOD)
    @Documented
    @Retention(RetentionPolicy.RUNTIME)
    public @interface ResponseNotNull {
    
    }

    步骤2 自定义拦截器

    import com.system.annotations.ResponseNotNull;
    import org.springframework.core.annotation.AnnotationUtils;
    import org.springframework.stereotype.Service;
    import org.springframework.web.method.HandlerMethod;
    import org.springframework.web.servlet.HandlerInterceptor;
    import org.springframework.web.servlet.ModelAndView;
    
    import javax.servlet.http.HttpServletRequest;
    import javax.servlet.http.HttpServletResponse;
    import java.util.Objects;
    
    /**
     * description:
     */
    @Service
    public class ResponseNotNullInterceptor implements HandlerInterceptor {
        private static final String RESPONSE_NOT_NULL_RESULT = "response_not_null_result";
    
        /**
         * 在请求前置中设置
         *
         * @param request
         * @param response
         * @param handler
         * @return
         * @throws Exception
         */
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (Objects.nonNull(handler) && handler instanceof HandlerMethod) {
                ResponseNotNull annotation = AnnotationUtils.findAnnotation(((HandlerMethod) handler).getMethod(), ResponseNotNull.class);
                if (Objects.nonNull(annotation)) {
                    request.setAttribute(RESPONSE_NOT_NULL_RESULT, RESPONSE_NOT_NULL_RESULT);
                    return true;
                }
            }
            return HandlerInterceptor.super.preHandle(request, response, handler);
        }
    
        @Override
        public void postHandle(HttpServletRequest request, HttpServletResponse response, Object handler, ModelAndView modelAndView) throws Exception {
            HandlerInterceptor.super.postHandle(request, response, handler, modelAndView);
        }
    
        @Override
        public void afterCompletion(HttpServletRequest request, HttpServletResponse response, Object handler, Exception ex) throws Exception {
            HandlerInterceptor.super.afterCompletion(request, response, handler, ex);
        }
    }

    步骤3 注册拦截器

    import com.system.interceptors.ResponseNotNullInterceptor;
    import org.springframework.context.annotation.Configuration;
    import org.springframework.web.servlet.config.annotation.InterceptorRegistry;
    import org.springframework.web.servlet.config.annotation.WebMvcConfigurer;
    
    /**
     * description: 拦截器添加地方
     */
    @Configuration
    public class AllWebMvcConfig implements WebMvcConfigurer {
    
    
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
            registry.addInterceptor(new ResponseNotNullInterceptor());
        }
    
    
    }

    步骤4 返回处理

    import com.alibaba.fastjson2.JSON;
    import com.alibaba.fastjson2.JSONWriter;
    import com.system.common.ResponseResult;
    import org.springframework.core.MethodParameter;
    import org.springframework.http.MediaType;
    import org.springframework.http.server.ServerHttpRequest;
    import org.springframework.http.server.ServerHttpResponse;
    import org.springframework.stereotype.Component;
    import org.springframework.web.context.request.RequestAttributes;
    import org.springframework.web.context.request.RequestContextHolder;
    import org.springframework.web.servlet.mvc.method.annotation.ResponseBodyAdvice;
    
    import java.util.Objects;
    
    /**
     * description:
     */
    @Component
    public class ResponseNotNullAdvice implements ResponseBodyAdvice {
    
        private static final String YYYY_MM_DD_HH_MM_SS = "yyyy-MM-dd HH:mm:ss";
    
    
        private static final String RESPONSE_NOT_NULL_RESULT = "response_not_null_result";
    
        @Override
        public boolean supports(MethodParameter returnType, Class converterType) {
            Object attribute = RequestContextHolder.getRequestAttributes().getAttribute(RESPONSE_NOT_NULL_RESULT, RequestAttributes.SCOPE_SESSION);
            if (Objects.nonNull(attribute)) {
                return true;
            }
            return false;
        }
    
        @Override
        public Object beforeBodyWrite(Object body, MethodParameter returnType, MediaType selectedContentType, Class selectedConverterType, ServerHttpRequest request, ServerHttpResponse response) {
            if (body instanceof ResponseResult) {
                return JSON.parseObject(JSON.toJSONString(body, YYYY_MM_DD_HH_MM_SS, JSONWriter.Feature.PrettyFormat));
            }
            return body;
        }
    }

    上面采用了一些其他工具jar包如下:

    
        com.alibaba.fastjson2
        fastjson2
        2.0.18
    

  • 相关阅读:
    CCLink转Modbus TCP网关_MODBUS网口设置
    Unity读书系列《Unity3D游戏开发》——脚本(一)
    在centos中注册gitlab runner
    Spring 中注入 Bean 的各种骚操作做
    GridSearchCV 工具介绍
    【Linux】Linux下静态库(.a)和动态库(.so)的制作和使用
    【腾讯云】打造未来智能应用的基石:腾讯混元大模型
    IDEFICS 简介: 最先进视觉语言模型的开源复现
    TI CC2642R 平台开发
    cocos creator项目构建问题
  • 原文地址:https://blog.csdn.net/haohaounique/article/details/128205409