注解实现校验接口传参是否超出取值范围

这篇具有很好参考价值的文章主要介绍了注解实现校验接口传参是否超出取值范围。希望对大家有所帮助。如果存在错误或未考虑完全的地方,请大家不吝赐教,您也可以点击"举报违法"按钮提交疑问。


写接口,Dto里很多字段要检验传参范围,自定义个注解来校验。

1、定义注解

注解定义代码:

import javax.validation.Constraint;
import javax.validation.ConstraintValidator;
import javax.validation.ConstraintValidatorContext;
import javax.validation.Payload;
import java.lang.annotation.*;
import java.util.Arrays;
import java.util.HashSet;
import java.util.Set;


@Target(ElementType.FIELD)
@Constraint(validatedBy = ListValue.ValidIfInRange.class)   //借助@Constraint注解实现自定义校验逻辑,validatedBy属性是数组类型,可同时定义多种校验逻辑
@Retention(RetentionPolicy.RUNTIME)
@Documented
public @interface ListValue {

    String message() default "The parameters are out of range, please check it.";  //超出取值范围后的抛错信息

    String[] valueList() default {};   //要检验的取值范围

    Class<?>[] groups() default {};

    Class<? extends Payload>[] payload() default {};

    class ValidIfInRange implements ConstraintValidator<ListValue, String> {

        private final Set<String> set = new HashSet<>();

        /**
         * 初始化逻辑,把取值范围存入Collection集合
         */
        @Override
        public void initialize(ListValue constraintAnnotation) {
            String[] values = constraintAnnotation.valueList();  
            set.addAll(Arrays.asList(values));
        }

        /**
         * 校验逻辑,返回false即值不存在,代表超出范围
         */
        @Override
        public boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {
            return set.contains(s);
        }
    }
}

实现思路是使用JSR303校验框架的@Constraint注解,实现ConstraintValidator接口,定义初始化和参数校验逻辑。

<!--PS: JSR303校验框架依赖-->
<dependency>
    <groupId>org.springframework.boot</groupId>
    <artifactId>spring-boot-starter-validation</artifactId>
</dependency>

2、使用注解

@PostMapping("/test")
public void doSome3(@Validated @RequestBody Dto dto){

}
public class Dto {

	@ListValue(valueList = {"createTime", "updateTime"}, message ="排序字段超出取值范围")
	String orderField;
	
}	

调用下:

注解实现校验接口传参是否超出取值范围,JavaDev,java,spring,springboot
注解实现校验接口传参是否超出取值范围,JavaDev,java,spring,springboot

3、其余校验实现思路2.0

借用 @JsonCreator 注解,反序列化前端传参成一个枚举对象时,进行校验。

@AllArgsConstructor
@Getter
public enum OrderFieldEnum {

    CREATE_TIME("createTime","create_time"),
    USER_NAME("userName","user_name");

    private final String value;
    private final String field;
    private static final Map<String,OrderFieldEnum> map = new HashMap<>(3);

    @JsonCreator
    public static OrderFieldEnum unSerializer(String value){
    	//把以value为key,以枚举对象为value,存进map
        if(map.isEmpty()){
            for (OrderFieldEnum fieldEnum : OrderFieldEnum.values()) {
                map.put(fieldEnum.value,fieldEnum);
            }
        }
        //map中找不到就是超出范围
        if(!map.containsKey(value)){
            throw new RuntimeException("超出范围");
        }
        return map.get(value);
    }

    @JsonValue
    public String getValue(){
        return this.value;   
    }


}

此时Dto:

public class Dto {
	
	OrderFieldEnum orderField;
	
}

4、其余校验实现思路3.0

这个就比较原始了,直接枚举类定义静态代码块完成取值范围初始化 + 一个静态方法完成校验:

注解实现校验接口传参是否超出取值范围,JavaDev,java,spring,springboot

这么实现的话,Service层就得调用方法校验下:

@Service
public Service implements IService{

	@Override
	public doSome(Dto dto){
		FieldEnum.checkCodeExist(dto.getField);
		//....
	}
}

其余优秀帖子备份:https://juejin.cn/post/7009190724214194207文章来源地址https://www.toymoban.com/news/detail-812770.html

到了这里,关于注解实现校验接口传参是否超出取值范围的文章就介绍完了。如果您还想了解更多内容,请在右上角搜索TOY模板网以前的文章或继续浏览下面的相关文章,希望大家以后多多支持TOY模板网!

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处: 如若内容造成侵权/违法违规/事实不符,请点击违法举报进行投诉反馈,一经查实,立即删除!

领支付宝红包 赞助服务器费用

相关文章

  • java基本数据类型取值范围

    在JAVA中一共有八种基本数据类型,他们分别是  byte、short、int、long、float、double、char、boolean  整型  其中byte、short、int、long都是表示整数的,只不过他们的取值范围不一样  byte的取值范围为-128~127,占用1个字节(-2的7次方到2的7次方-1)  short的取值范围为-32768~32767,占用

    2024年02月12日
    浏览(36)
  • signed char 与 unsigned char 的取值范围

      🔗 《C语言趣味教程》👈  猛戳订阅!!! 在讲解数据类型前,我们不得不先讲解一些必备的知识点,比如如何定义一个变量,数据类型的基本概念。并介绍 ASCII 码,为 char 类型的讲解做必要的铺垫。然后讲解原码反码和补码,讲解 IEEE754标准时需要这部分的知识作为基

    2024年02月13日
    浏览(40)
  • java 自定义xss校验注解实现

    自定义一个注解@Xss。名字随意 validator校验类:XssValidator。这个校验类要和上面的@Xss注解上的 @Constraint(validatedBy = { XssValidator.class })对应 具体使用在某个字段上加上注解;形如: 然后在控制层中增加@Validated注解校验就可以了  以上代码实现后。会自动针对某些增加了@Xss字符

    2024年02月14日
    浏览(46)
  • MySQL中IN的取值范围较大时会导致索引失效

    结论:IN肯定会走索引,但是当IN的取值范围较大时会导致 索引失效,走全表扫描 navicat可视化工具使用explain函数查看sql执行信息 1.1 场景1:当IN中的取值只有一个主键时 我们只需要注意一个最重要的type 的信息很明显的提现是否用到索引: type结果值从好到坏依次是: syste

    2024年02月15日
    浏览(34)
  • 后端表情包依赖+自定义注解实现校验

    开发过程中遇到小程序登记信息填写文本时可能输入表情包,需要后端校验 由于字段太多,所以用自定义注解的方式来实现 步骤1:在pom文件中加入表情包依赖 步骤2: 自定义注解类 步骤3: 在请求的实体使用这个注解,需要要在controller中加入@Validated注解,校验才会生效

    2024年02月16日
    浏览(33)
  • Java自定义校验注解实现List、set集合字段唯一性校验

    在开发过程中,前端给后端传递集合,并且需要保证集合的实体类中的某些字段必须是惟一的,不能重复。 传递的集合: 集合对应的实体类: 如果我们要保证传递的name或者card必须是唯一的,不能重复,应该如何实现呢,此时可以通过自定义注解的方式实现。 @Documented @Do

    2024年02月14日
    浏览(39)
  • 删除维护计划时报错:索引超出范围必 须为⾮负值并⼩于集合⼤⼩

    问题:删除维护计划时报错:索引超出范围必 须为⾮负值并⼩于集合⼤⼩ 在SQL Server 2016上删除已运行维护计划后,维护计划job没有自动删除掉,手工再删除维护计划job,提示删除失败。 错误现象:delete  语句与 reference 约束\\\"FK_subplan_job_id\\\"冲突。该冲突发生于数据库\\\"msdb\\\",表

    2024年02月11日
    浏览(36)
  • Spring中@Value注解取值为null问题排查

    一、背景 近期应用中因业务迭代需要接入 user 客户端,接入后总是启动失败,报注册 user bean 依赖的配置属性为 null(如 appName,group 等都为空),示例代码如下: 二、@Value 取值为 null 原因分析 2.1. @Value 取值为 null 常见原因分析 常见现象一:类没有交给 Spring 管理,比如类没

    2024年02月10日
    浏览(37)
  • mysql如何实现根据经纬度判断某一个坐标是否在一个多边形区域范围内

    要根据经纬度判断一个坐标是否在一个多边形区域内,MySQL提供了几种函数来处理地理空间数据,其中包括用于处理多边形区域的函数。 首先,创建一个表来存储多边形区域。可以使用 ST_GeomFromText 函数将多边形的坐标转换为地理空间对象。我们给他插入两条数据,默认id第一

    2024年02月08日
    浏览(56)
  • 关于微信小程序、字节小程序rich-text中图片宽度超出范围解决办法

    微信小程序和字节小程序中的rich-text可以将后台富文本显示在前端,但是当图片过宽时微信小程序中就会超出显示范围,而字节小程序中却不会。(微信开发者是不是该优化下这个控件了 ) 微信小程序中    字节小程序中    那就解决微信小程序中的显示问题就可以了,可

    2024年02月11日
    浏览(56)

觉得文章有用就打赏一下文章作者

支付宝扫一扫打赏

博客赞助

微信扫一扫打赏

请作者喝杯咖啡吧~博客赞助

支付宝扫一扫领取红包,优惠每天领

二维码1

领取红包

二维码2

领红包