springboot使用注解做接口非空判断

1定义一个在方法上作用的注解

@Retention(RetentionPolicy.RUNTIME) // 表示注解在运行时依然存在
@Target(ElementType.METHOD)  
@Documented
public @interface noNull {
    public String str() default "";
}

2定义一个拦截类,拦截被注解的方法,并验证注解中指定的方法是否为空

public class NoNullInterceptor extends HandlerInterceptorAdapter{
     //在请求处理之前进行调用(Controller方法调用之前
    @Override
    public boolean preHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o) throws Exception {

        //如果不是映射到方法直接通过
        if (!(o instanceof HandlerMethod)) {
            return true;
        }
        HandlerMethod handlerMethod = (HandlerMethod) o;
        Method method = handlerMethod.getMethod();
        if (method.getAnnotation(noNull.class) != null) {
            noNull  noNullAnnotation=method.getAnnotation(noNull.class);
            String Str = noNullAnnotation.str();
            //从httpServletRequest获取注解上指定的参数
            Object obj = httpServletRequest.getParameter(Str);
            if(null != obj){
                return true;
            }else{
                httpServletResponse.getWriter().write(JSON.toJSONString(new Result("false","参数缺失")));
                return false;
            }
        }else{
            return true;
        }
    }

    //请求处理之后进行调用,但是在视图被渲染之前(Controller方法调用之后)
    @Override
    public void postHandle(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, ModelAndView modelAndView) throws Exception {

    }

    //在整个请求结束之后被调用,也就是在DispatcherServlet 渲染了对应的视图之后执行(主要是用于进行资源清理工作)
    @Override
    public void afterCompletion(HttpServletRequest httpServletRequest, HttpServletResponse httpServletResponse, Object o, Exception e) throws Exception {

    }
}

3将上步定义的拦截类加入到拦截链

@Configuration
public class interceptorConfig extends WebMvcConfigurerAdapter{
    public void addInterceptors(InterceptorRegistry registry){       
        registry.addInterceptor(new NoNullInterceptor())
                .addPathPatterns("/**"); 
        //非空字段拦截
        super.addInterceptors(registry);
    }
}

4将注解和需要验证非空的参数在需要做非空check的方法声明

    @noNull(str = "userName")
    public Result  sysLogin (
            @RequestParam(value="userName", required=false) String userName,
            @RequestParam(value="passWord", required=false) String passWord
            ) {
        return Service.sysLogin(userName, passWord);
    }

5实现效果
这里写图片描述

猜你喜欢

转载自blog.csdn.net/weixin_39168678/article/details/82011851