自定义注解校验List集合数据

该博客介绍了如何使用自定义注解@StringList对信息封装类中的List集合进行元素校验,支持正则表达式和空集合检查。在控制器中使用@Valid和@RequestBody对请求参数进行校验,确保数据的正确性。当集合为空或元素不满足正则表达式时,会返回相应的错误信息。
部署运行你感兴趣的模型镜像

实现功能:自定义注解实现对信息封装类中的List集合中的元素信息校验,并支持通过注解属性指定是否允许集合为空。

自定义注解
@Target(FIELD)
@Retention(RUNTIME)
@Constraint(validatedBy = StringListValidator.class)
public @interface StringList {
    // 检验失败时的错误提示信息
    String message() default "字符串格式错误";

    // 集合为空时的错误提示信息
    String emptyMessage() default "集合不能为空";

    // 校验规则,支持正则表达式
    String regexp();

    // 集合是否可以为空,默认可以为空
    boolean allowEmpty() default true;

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

    Class<? extends Payload>[] payload() default {};
}
自定义注解解析器
public class StringListValidator implements ConstraintValidator<StringList, List<String>> {

    private String regexp = "";

    private boolean allowEmpty;

    private String emptyMessage;

    /**
     * 初始化方法
     * @param constraintAnnotation
     */
    @Override
    public void initialize(StringList constraintAnnotation) {
        this.regexp = constraintAnnotation.regexp();
        this.emptyMessage = constraintAnnotation.emptyMessage();
        this.allowEmpty = constraintAnnotation.allowEmpty();
    }

    /**
     * 校验的方法
     * @param list
     * @param context
     * @return
     */
    @Override
    public boolean isValid(List<String> list, ConstraintValidatorContext context) {
        if(CollectionUtils.isEmpty(list)) {
            if(!allowEmpty) {
               // 必须禁用,不然返回的message信息会在message和emptyMessage之间切换
               context.disableDefaultConstraintViolation(); 			
                context
                   .buildConstraintViolationWithTemplate(emptyMessage)
                   .addConstraintViolation();
            }
            return allowEmpty;
        }
        for(String str : list) {
            if(!str.matches(regexp)) {
                return false;
            }
        }
        return true;
    }
}
在封装类中使用注解
/**
 * 功能描述:删除学生信息的参数封装类
 */
@Data
public class StudentDeleteReq {
    /**
     * 学生id集合
     * regexp: ids集合中元素校验的正则表达式,会对集合中的每个元素都进行正则表达式校验
     * allowEmpty:是否允许集合为空,默认允许为空,false表示不允许集合为空
     * message:ids中元素格式检验失败时的提示信息
     * emptyMessage:ids集合为空时的提示信息
     */
    @StringList(regexp = "^[0-9]{1,20}$", allowEmpty = false, message = "id格式错误", emptyMessage = "id不能为空")
    private List<String> ids;
}
在Controller中添加检验注解
/**
     * 删除学生信息,支持单个删除和批量删除
     *
     * @param deleteReq 信息封装类
     * @return 操作结果
     */
@PostMapping("/delete")
public Result delete(@Valid @RequestBody StudentDeleteReq deleteReq) {
    // 业务代码
    。。。。
}
测试

集合为空时的校验错误信息:

在这里插入图片描述

集合中元素格式错误时的错误信息:

在这里插入图片描述

您可能感兴趣的与本文相关的镜像

ACE-Step

ACE-Step

音乐合成
ACE-Step

ACE-Step是由中国团队阶跃星辰(StepFun)与ACE Studio联手打造的开源音乐生成模型。 它拥有3.5B参数量,支持快速高质量生成、强可控性和易于拓展的特点。 最厉害的是,它可以生成多种语言的歌曲,包括但不限于中文、英文、日文等19种语言

### Java自定义注解实现参数校验的功能 在Java开发中,通过自定义注解可以灵活地满足复杂的业务需求。以下是基于提供的引用内容以及标准实践的一个完整示例。 #### 创建自定义注解 首先需要定义一个注解类,并指定其作用范围和生命周期。以下是一个名为`@State`的自定义注解: ```java package com.example.validate; import javax.validation.Constraint; import javax.validation.Payload; import java.lang.annotation.*; @Documented @Target({ElementType.METHOD, ElementType.FIELD, ElementType.PARAMETER}) @Retention(RetentionPolicy.RUNTIME) @Constraint(validatedBy = StateValidator.class) // 验证器类 public @interface State { String value(); // 定义允许的状态值列表 String message() default "Invalid state"; // 默认错误提示信息 Class<?>[] groups() default {}; Class<? extends Payload>[] payload() default {}; } ``` 此部分展示了如何创建一个简单的自定义注解[@State],它能够接收一组合法状态作为输入并提供默认的消息处理机制[^1]。 #### 编写验证逻辑 接着需编写具体的验证逻辑,即实现`javax.validation.ConstraintValidator<A,T>`接口。这里以检查整数类型的字段是否属于预设的一组有效状态为例: ```java package com.example.validate; import javax.validation.ConstraintValidator; import javax.validation.ConstraintValidatorContext; import java.util.Arrays; import java.util.List; public class StateValidator implements ConstraintValidator<State, Integer> { private List<Integer> allowedStates; @Override public void initialize(State constraintAnnotation) { this.allowedStates = Arrays.asList(constraintAnnotation.value().split(",")) .stream() .map(Integer::parseInt) .toList(); } @Override public boolean isValid(Integer value, ConstraintValidatorContext context) { if (value == null || allowedStates.contains(value)) { return true; } return false; } } ``` 上述代码片段实现了对传入数值的合法性判断过程,其中初始化方法负责解析配置好的可接受状态集合;而有效性检测函数则依据当前实例属性决定是否符合预期条件[^2]。 #### 使用自定义注解 最后可以在实体类或者控制器层的方法签名上运用该注解来进行约束声明: ```java public class OrderRequest { @State("0,1") // 只能取值为0或1 private int orderStatus; // Getter and Setter omitted... } // 或者应用于Controller中的请求参数 @RestController @RequestMapping("/orders") public class OrderController { @PostMapping("/{id}") public ResponseEntity<String> updateOrder(@PathVariable Long id, @RequestBody @Valid OrderRequest request){ // Business logic here ... return ResponseEntity.ok("Success"); } } ``` 以上例子说明了怎样利用Spring框架下的自动注入特性配合Hibernate Validator完成基本的数据完整性检验工作流程^。 --- 问题
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

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

抵扣说明:

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

余额充值