springboot自定义注解实现参数验证

效果演示:

1.创建自定义注解类

@Target(ElementType.PARAMETER)// 表示该注解是加载参数上的; @Target: 定义放在什么位置,这个是放在参数中
@Retention(RetentionPolicy.RUNTIME)// 注解保留到运行阶段; @Retention: 定义了该Annotation被保留的时间长短,有些只在源码中保留,有时需要编译成的class中保留,有些需要程序运行时候保留。即描述注解的生命周期
public @interface ParamsNotNull {

}

2.自定义拦截器

/**
 * @description: 参数检查注解拦截器
 */
@Component
public class CheckParamsInterceptor extends HandlerInterceptorAdapter {

    public static final String LOGGER_NAME = "EXCEPTION";
    private final static Logger logger = LoggerFactory.getLogger(LOGGER_NAME);

    @Override
    public boolean preHandle(HttpServletRequest request, HttpServletResponse response, Object handler) throws Exception {
        if (!(handler instanceof HandlerMethod)) {
            logger.info("UnSupport handler");
            return true;
        }
        List<String> list = getParamsName((HandlerMethod) handler);
        // 线程安全的字符串拼接
        StringBuffer stringBuffer = new StringBuffer();
        // 检查参数是否为空
        for (String s : list) {
            String parameter = request.getParameter(s);
            //这个地方是定义缺少参数或者参数为空的时候返回的数据
            if (StringUtils.isEmpty(parameter)){
                // 参数为空记录进字符串,并进行循环拼接
                stringBuffer.append("缺少必要参数"+s+";");
            }
        }
        if (!StringUtils.isEmpty(stringBuffer)) {
            // 当stringBuffer为空的时候,表示没有参数为空
            JointResult jointResult = new JointResult();
            jointResult.setSuccess(false);
            jointResult.setCode(2103);
            jointResult.setMessage(stringBuffer.toString());
            response.setHeader("Content-type", "application/json;charset=UTF-8");
            //跨域
            response.setHeader("Access-Control-Allow-Origin", "*");
            response.getWriter().write(JSONObject.toJSONString(jointResult));
            return false;
        } else {
            return true;
        }
    }

    /**
     * 获取使用了该注解的参数名称
     */
    private List getParamsName(HandlerMethod handlerMethod) {
        // 利用java反射获取参数
        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;
    }

}

起重日志使用的是@Slf4j+logback,自定义了exception记录日志。该拦截器验证参数会对所有参数进行验证,若存在多个参数为空,会统一返回。如:

3.配置拦截器,增加校验拦截器

/**
 * @description: 拦截器
 */
@Configuration
public class WebMvcConfig implements WebMvcConfigurer {
    @Autowired
    private CheckParamsInterceptor checkSourceInterceptor;

    /**
     * 增加校验拦截器
     * @param registry
     */
    @Override
    public void addInterceptors(InterceptorRegistry registry) {
        // 这个地方可以定义拦截器的具体的路径,启动项目时就会执行此方法
        registry.addInterceptor(checkSourceInterceptor).addPathPatterns("/**");
    }
}

 

  • 1
    点赞
  • 3
    收藏
    觉得还不错? 一键收藏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值