代码编织梦想

自定义注解实现特定传参校验

Y. pom引用包
<dependency>
    <groupId>org.hibernate</groupId>
    <artifactId>hibernate-validator</artifactId>
    <version>6.0.18.Final</version>
</dependency>

<dependency>
    <groupId>javax.validation</groupId>
    <artifactId>validation-api</artifactId>
</dependency>
E. 实现body参数校验
E-Y. 实现限定必传且限定参数传参

根据业务需求设定,限定传参校验实现
代码如下:
定义In注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InValidator.class}
)
public @interface In {
    String message() default "The value is not within a given range.";
    int[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现In注解逻辑代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class InValidator implements ConstraintValidator<In, Integer> {
    private int[] checkedValues;
    public InValidator() {
    }
    public void initialize(In constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return false;
        } else {
            int[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                Integer checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-E. 实现字符串传参非必填且限定参数

根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InOrNullValidator.class}
)
public @interface InOrNull {
    String message() default "The value is not within a given range or null.";
    String[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现InOrNull注解逻辑代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNullValidator implements ConstraintValidator<InOrNull, String> {
    private String[] checkedValues;
    public InOrNullValidator() {
    }
    public void initialize(InOrNull constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(String value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        } else {
            String[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                String checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-S. 实现整型传参非必填且限定参数

根据业务需求设定,限定传参校验实现
代码如下:
定义InOrNull4Integer注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {InOrNull4IntegerValidator.class}
)
public @interface InOrNull4Integer {
    String message() default "The value is not within a given range or null.";
    int[] values() default {};
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现InOrNull4Integer注解逻辑代码

import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
public class InOrNull4IntegerValidator implements ConstraintValidator<InOrNull4Integer, Integer> {
    private int[] checkedValues;

    public InOrNull4IntegerValidator() {
    }
    public void initialize(InOrNull4Integer constraintAnnotation) {
        this.checkedValues = constraintAnnotation.values();
    }
    public boolean isValid(Integer value, ConstraintValidatorContext context) {
        if (value == null) {
            return true;
        } else {
            int[] var3 = this.checkedValues;
            int var4 = var3.length;
            for(int var5 = 0; var5 < var4; ++var5) {
                Integer checkedValue = var3[var5];
                if (value.equals(checkedValue)) {
                    return true;
                }
            }
            return false;
        }
    }
}
E-S . 实现JSON字符串传参非必填且限定JSON格式

根据业务需求设定,限定传参校验实现
代码如下:
定义JsonValid注解

import java.lang.annotation.Documented;
import java.lang.annotation.ElementType;
import java.lang.annotation.Retention;
import java.lang.annotation.RetentionPolicy;
import java.lang.annotation.Target;
import javax.validation.Constraint;
import javax.validation.Payload;

@Documented
@Target({ElementType.FIELD, ElementType.METHOD, ElementType.ANNOTATION_TYPE, ElementType.CONSTRUCTOR, ElementType.PARAMETER})
@Retention(RetentionPolicy.RUNTIME)
@Constraint(
    validatedBy = {JsonValidValidator.class}
)
public @interface JsonValid {
    String message() default "Illegal json formatted string.";
    Class<?>[] groups() default {};
    Class<? extends Payload>[] payload() default {};
}

实现JsonValid注解逻辑代码

import com.mws.onepagebook.core.common.util.StringUtils;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.io.IOException;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;

public class JsonValidValidator implements ConstraintValidator<JsonValid, String> {
    public JsonValidValidator() {
    }

    public boolean isValid(String value, ConstraintValidatorContext constraintValidatorContext) {
        if (value == null) {
            return true;
        } else if (StringUtils.equals("", value)) {
            return false;
        } else {
            try {
                ObjectMapper mapper = new ObjectMapper();
                mapper.readTree(value);
                return true;
            } catch (IOException var4) {
                return false;
            }
        }
    }
}

S.测试

S-Y. 定义Dto参数

import com.mws.onepagebook.core.common.validator.In;
import com.mws.onepagebook.core.common.validator.InOrNull;
import com.mws.onepagebook.core.common.validator.InOrNull4Integer;
import com.mws.onepagebook.core.common.validator.JsonValid;
import lombok.Data;
import org.springframework.validation.annotation.Validated;

import java.io.Serializable;

@Validated
@Data
public class Param implements Serializable {
    private static final long serialVersionUID = 1L;

    /**
     * 编号 varchar
     */
    @In(values = {10, 20, 30}, message = "编号传值不正确")
    private Integer orderNo;

    /**
     * 单号 varchar
     */
    @InOrNull(values = {"H10", "H20", "H30"}, message = "单号传值不正确")
    private String expressNo;


    /**
     * 类型 Integer
     */
    @InOrNull4Integer(values = {10, 20, 30}, message = "类型传值不正确")
    private Integer type;

    /**
     * ext json
     */
    @JsonValid(message = "ext参数非Json串")
    private String ext;

}

@RequestMapping("/param")
public class ParamController {

    @PostMapping(value = "/info",produces = MediaType.APPLICATION_JSON_VALUE)
    public Param info(@Valid @RequestBody Param param){
        System.out.println(param);
        return param;
    }
}

请求测试

在这里插入图片描述

localhost:8080/param/info
传参
{
“orderNo”:10, //必传 根据values定义传值
“expressNo”:“H10”, //非必传 根据values定义传值
“type”:20,//非必传 根据values定义传值
“ext”:“{}”//非必传 传值必须是json字符串
}

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/END_Loving/article/details/127208920

快速学习 spring boot 技术栈_软件供应链的博客-爱代码爱编程

文章推荐 Selenium 自动化测试从零实战【原文链接】 原来这样做,才能向架构师靠近【原文链接】 Cordova App 打包全揭秘【原文链接】 TensorFlow on Android:物体识别【原文链

springmvc的高级技术_godmanha的博客-爱代码爱编程

SpringMVC的高级技术 本章的主要内容包括: SpringMVC配置的替代方案处理文件上传在控制器中处理异常使用flash属性 1 SpringMVC配置的替换方案 在之前的内容中,通过扩展AbstractAn

** 支付解决方案-爱代码爱编程

课程目标 掌握二维码生成插件qrious的使用 能够说出微信支付开发的整体思路 能够调用微信支付接口(统一下单)生成支付二维码 能够调用微信支付接口(查询订单)查询支付状态 实现支付日志的生成与订单状态的修改 一. 二

从零学 spring cloud第2-2课:基础 web 开发之数据校验_heyu5225的博客-爱代码爱编程

什么是Hibernate Validator     我们在项目中,经常要对用户输入的参数进行一些参初步的校验,有些人会在前端JS中写一些校验,也有人写在业务代码中。Hibernate Validator框架 提供了更好的

经验整理-1-dubbo-zookeeper-RPC-100-@-爱代码爱编程

-------------------dubbo和cloud对比------------巧记:组件均衡注册RPC降级监控链路配置 dubbo+zk(自带就支持吗)cloud(自带就支持吗)注册与服务发现(自带) zk(一致性---zk集群有主从区别,当master宕机,进入选举模式时,就无法正常对外提供服务。),关注点:1、过半选举算法--无leader

CGB2005-京淘20(权限控制,ThreadLocal简化request传参,京淘订单模块 表关系说明 对象引用传参 时间戳设置主键 serialize传参 多表入库/查询,超时订单的处理 )-爱代码爱编程

注意事项 1.实现京淘项目权限控制 Springmvc拦截器说明 SpringMVC程序调用流程 WebMvcConfigurer这个配置类继承的接口相当于web.xml配置文件 在拦截其中获取user对象传到request对象中到控制层,在取出来简化代码 ThreadLocal(本地线程变量):进一步简化request传参不能随便定义reques对象,

msa-note-爱代码爱编程

笔记2 # 一.Spring Security 安全框架 权限控制 > security网址 https://gitee.com/zhao-qing-jing/msa2104/tree/master/02-jt-spring-security > 为什么选择SpringSecurity框架 功能强大 springB

32.项目总结--技术点部分-爱代码爱编程

项目整体架构 Docker 虚拟化容器计数,Docker基于镜像,可以秒级启动各种容器,每一种容器都是一个完整的运行环境,容器之间相互隔离; 安装docker 安装前卸载原有的docker yum remove docker \ docker-client \ doc

JAVAWEB-NOTE04-爱代码爱编程

1. unit12-mybatis框架 课程计划: 1、MyBatis快速入门 2、MyBatis对数据库中数据的增删改查操作 3、#{}占位符的应用 4、动态SQL的应用 5、MyBatis的Mapper接口开发 1.1 MyBatis简介(了解) 1.1.1 什么是MyBatis MyBatis 本是apache的一个开源项目iB

JavaWeb:带你快速了解JavaWeb,从入门到实践,涵盖javaweb的各个知识点解决在实践中遇到的问题-爱代码爱编程

目录 一、引言 1.1 C/S架构和B/S架构 1.2 C/S架构(Client/Server 客户端/服务器) 1.3 B/S架构(Browser/Server 浏览器/服务器) 二 、服务器 2.1 概念 2.1.1 什么是Web 2.1.2 什么是Web服务器 2.2 常见服务器 2.3 Tomcat服务器 2.4 Tomcat

2022年java开发工程师面试题、常用注解_鑫品的博客-爱代码爱编程

string中的常用方法:字符串转换为int(Integer.parseInt(a))      compareTo()比较两字符串的字典顺序(>为1,<为-1,等于为0)      concat()拼接两个字符串      contains()当包含指定的值时返回true      equalsIgnoreCase()判断两个字符串是否相等,

《进阶篇第3章:vue进阶-组件》包含组件、自定义事件、插槽、路由等等扩展知识点_刘大猫.的博客-爱代码爱编程

文章目录 3.1传统方式编写和组件化方式编写区别?3.2概念:模块与组件、模块化与组件化1)模块2)组件3)模块化4)组件化3.3非单文件组件3.3.1使用Vue.extend({})方式创建组件(了解,实际不常用)举例:3.3.2组件嵌套举例:练习组件嵌套3.3.3VueComponent构造函数3.3.4一个重要的内置关系3.4单文件组件3.5

day75.ajax、拦截器interceptor、异常映射、自动|手动类型转换、类型校验_ajax响应拦截器-爱代码爱编程

目录 一、Ajax ★ 1. 基本类型参数传递  @ResponseBody响应体 2. Ajax传递实体类 3.Ajax传递实体类带级联属性 (非json 普通参数) @DateTimeFormat 4.Ajax传递实体类(JSON格式)带级联属性 5.Ajax返回实体类 6.为什么要加@RequestBody (@RequestBody、

springmvc全注解开发-爱代码爱编程

目录 SpringMVC入门案例SpringMVC执行流程controller控制器请求映射路径参数传递POST请求中文乱码处理@RequestParam 获取URL参数@EnableWebMvc参数传递(Js