zoukankan      html  css  js  c++  java
  • springboot自定义注解 判断参数是否传递或者为空

    原文链接:https://blog.csdn.net/weixin_37535975/article/details/94443617

    1.自定义个注解类

    @Target({ElementType.PARAMETER})//参数级别
    @Retention(RetentionPolicy.RUNTIME) //注解保留到运行阶段
    public @interface ParamsNotNull {
    }

    @Target
    通俗讲,定义放在什么位置,这个是放在参数中
    此外还有
    1.ElementType.CONSTRUCTOR:用于描述构造器
    2.ElementType.FIELD:用于描述域(类的成员变量)
    3.ElementType.LOCAL_VARIABLE:用于描述局部变量(方法内部变量)
    4.ElementType.METHOD:用于描述方法
    5.ElementType.PACKAGE:用于描述包
    6.ElementType.PARAMETER:用于描述参数
    7.ElementType.TYPE:用于描述类、接口(包括注解类型) 或enum声明
    @Retention 定义了该Annotation被保留的时间长短,有些只在源码中保留,有时需要编译成的class中保留,有些需要程序运行时候保留。即描述注解的生命周期
    此时针对的在运行中,此外还有
    1.RetentionPoicy.SOURCE:在源文件中有效(即源文件保留)
    2.RetentionPoicy.CLASS:在class文件中有效(即class保留)
    2.自定义拦截器,具体判断请求来的参数

    /**
     * @Description 参数检查注解拦截器
     */
    public class CheckParamsInterceptor extends HandlerInterceptorAdapter {
        private static Logger logger = LoggerFactory.getLogger(CheckParamsInterceptor.class);
    
        @Override
        public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
            if (!(handler instanceof HandlerMethod)) {
                logger.warn("UnSupport handler");
                return true;
            }
            List<String> list = getParamsName((HandlerMethod) handler);
            for (String s : list) {
                String parameter = request.getParameter(s);
                if (StringUtils.isEmpty(parameter)){
                    JSONObject jsonObject = new JSONObject();
                    //这个地方是定义缺少参数或者参数为空的时候返回的数据
                    jsonObject.put("status", 203);
                    jsonObject.put("msg", "缺少必要的"+s+"");
                    response.setHeader("Content-type", "application/json;charset=UTF-8");
                    response.setHeader("Access-Control-Allow-Origin", "*");//跨域
                    response.getWriter().write(jsonObject.toJSONString());
                    return false;
                }
            }
            return true;
        }
    /**
     * 获取使用了该注解的参数名称
     */
    private List getParamsName(HandlerMethod handlerMethod) {
        Parameter[] parameters = handlerMethod.getMethod().getParameters();
        List<String> list = new ArrayList<>();
        for (Parameter parameter : parameters) {
            //判断这个参数时候被加入了 ParamsNotNull. 的注解
            //.isAnnotationPresent()  这个方法可以看一下
            if(parameter.isAnnotationPresent(ParamsNotNull.class)){
                list.add(parameter.getName());
            }
        }
        return list;
    }


    3.添加校验的拦截器config

    @Configuration
    public class WebMvcConfig implements WebMvcConfigurer {
        CheckParamsInterceptor checkSourceInterceptor = new CheckParamsInterceptor();
        //增加校验拦截器
        @Override
        public void addInterceptors(InterceptorRegistry registry) {
           // 这个地方可以定义拦截器的具体的路径
            registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**");
        }
    }


    4.写一个测试类测试一下效果

    @RestController
    @RequestMapping("/test")
    public class TestController {
    
        @RequestMapping("/test")
        //注解不要加,在参数类型前边加上
        public  String     test(@ParamsNotNull  String userId){
            return  "ok";
        }
    }

    这个是当参数为空的时候的校验

    这个是没有这个参数属性的时候,其实效果是一样的

    这样以后再判断参数是不是为空的时候,直接加个注解就可以了~!就不用再单独判断参数为空啦!

    原文链接:https://blog.csdn.net/weixin_37535975/article/details/94443617

  • 相关阅读:
    JDK8 Optional类使用
    Kafka RocketMQ
    Dubbo,ElasticSearch,JVM,多线程/高并发,消息中间件 常问问题
    Redis
    java jvm 虚拟机
    25 岁做什么,可在 5 年后受益匪浅?
    设计模式
    并发与并行的理解
    多线程学习
    FireFox 如何在当前页面打开书签
  • 原文地址:https://www.cnblogs.com/yunian139/p/12009463.html
Copyright © 2011-2022 走看看