Validated的分组校验和自定义校验注解

2024-05-28 21:52

本文主要是介绍Validated的分组校验和自定义校验注解,希望对大家解决编程问题提供一定的参考价值,需要的开发者们随着小编来一起学习吧!

1. Validated的分组校验     

1.1 简介

        Validated的分组校验是指根据不同的校验规则对同一个实体类进行不同的校验。这在实际开发中非常常见,比如在新增和更新操作中,可能有不同的校验规则。

1.2 使用方法

        在实体类中,我们可以利用javax.validation.constraints包下的注解来定义不同的校验规则,并使用分组校验的方式来指定在不同的场景下使用哪些校验规则。

举例子:我的代码添加的时候,是使用mysql的主键自动生成策略不需要传入主键,但修改的时候需要,他们又需要相同的javabean对象,如果没有分组校验,难道我需要再创一个javabean还是传入的是否手动使用if判断,显然和下述对比,这两种都很麻烦。

@Data
@NoArgsConstructor
@AllArgsConstructor
public class Category {@NotNull(groups = Update.class)//因为新增不需要,修改需要,可以设置分组校验private Integer id;//文章分类id@NotEmptyprivate String categoryName;//文章分类名称@NotEmptyprivate String categoryAlias;//文章分类别名private Integer createUser;//创建人id@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")//添加日期格式private LocalDateTime createTime;//创建时间@JsonFormat(pattern = "yyyy-MM-dd HH:mm:ss")private LocalDateTime updateTime;//修改时间//设置分组校验public interface Add extends Default{}public interface Update extends Default {}
}

        在上面的例子中,我们定义了一个Category实体类,并使用@NotNull@NotBlank等注解来定义校验规则,并通过groups属性来指定在不同的分组下生效。 

1.3 在Controller中使用分组校验

在Controller中,我们可以利用@Validated注解来指定需要校验的分组,并通过BindingResult来获取校验结果。

/*** 更新文章分类* @param category 解析前端提交的json封装的javabean* @return 是否修改成功*/
@PutMapping
public Result updateCategory(@RequestBody @Validated(Category.Update.class) Category category){categoryService.updateCategory(category);return Result.success();
}
/*** 新增文章分类* @param category 文章分类的javabean,自动解析前端提交的json数据并进行封装* @return 是否添加成功*/
@PostMapping
public Result addCategory(@RequestBody @Validated(Category.Add.class) Category category){categoryService.addCategory(category);return Result.success();
}

2. 自定义校验注解 

2.1 简介

        除了使用内置的校验注解外,我们还可以自定义校验注解来满足特定的校验需求。自定义校验注解通常需要定义一个注解接口,并编写对应的校验器。

2.2 使用方法

首先,我们定义一个自定义的校验注解@State:作用是标记该属性为枚举类型,只能含有两种状态,其他的状态报错。

/*** @Description: Validated自定义参数校验的注解* @Author: windStop* @Date: 2024/5/28 15:29*/
@Target({ElementType.FIELD})
@Retention(RetentionPolicy.RUNTIME)
@Documented
@Constraint(validatedBy = {StateValidation.class})//谁来提供校验规则
public @interface State {//提供校验失败后的提示信息String message() default "{state的值只能是已发布或者是草稿}";//指定分组Class<?>[] groups() default {};//负载 , 可以获取附加信息Class<? extends Payload>[] payload() default {};
}

然后编写对应的校验器 StateValidation 并实现 ConstraintValidator<State,String>约束校验器接口

泛型一:给哪个注解提供校验规则
泛型二:校验的数据类型

/*** @Description: 提供自定义校验规则的类* @Author: windStop* @Date: 2024/5/28 15:33* ConstraintValidator<State,String>   参数一: 给哪个注解提供校验规则  参数二:校验的数据类型*/
public class StateValidation implements ConstraintValidator<State,String> {/*** 判断被@State标记的字段是否符合要求* @param s 待校验的值* @param constraintValidatorContext 在校验过程中进行一些上下文相关的操作* @return 是否符合要求*/@Overridepublic boolean isValid(String s, ConstraintValidatorContext constraintValidatorContext) {//提供校验规则if (s == null) return false;return s.equals("已发布") || s.equals("草稿");}
}
最后,在实体类中使用自定义的校验注解直接在属性中使用@State即可

通过以上的步骤,我们可以轻松地在Spring Boot项目中使用Validated的分组校验和自定义校验注解,实现灵活且强大的数据校验功能。

希望本文对你有所帮助,祝你在项目中顺利应用数据校验功能!

这篇关于Validated的分组校验和自定义校验注解的文章就介绍到这儿,希望我们推荐的文章对编程师们有所帮助!



http://www.chinasem.cn/article/1011789

相关文章

springboot自定义注解RateLimiter限流注解技术文档详解

《springboot自定义注解RateLimiter限流注解技术文档详解》文章介绍了限流技术的概念、作用及实现方式,通过SpringAOP拦截方法、缓存存储计数器,结合注解、枚举、异常类等核心组件,... 目录什么是限流系统架构核心组件详解1. 限流注解 (@RateLimiter)2. 限流类型枚举 (

SpringBoot 异常处理/自定义格式校验的问题实例详解

《SpringBoot异常处理/自定义格式校验的问题实例详解》文章探讨SpringBoot中自定义注解校验问题,区分参数级与类级约束触发的异常类型,建议通过@RestControllerAdvice... 目录1. 问题简要描述2. 异常触发1) 参数级别约束2) 类级别约束3. 异常处理1) 字段级别约束

Java中使用 @Builder 注解的简单示例

《Java中使用@Builder注解的简单示例》@Builder简化构建但存在复杂性,需配合其他注解,导致可变性、抽象类型处理难题,链式编程非最佳实践,适合长期对象,避免与@Data混用,改用@G... 目录一、案例二、不足之处大多数同学使用 @Builder 无非就是为了链式编程,然而 @Builder

spring中的@MapperScan注解属性解析

《spring中的@MapperScan注解属性解析》@MapperScan是Spring集成MyBatis时自动扫描Mapper接口的注解,简化配置并支持多数据源,通过属性控制扫描路径和过滤条件,利... 目录一、核心功能与作用二、注解属性解析三、底层实现原理四、使用场景与最佳实践五、注意事项与常见问题六

SpringBoot+EasyExcel实现自定义复杂样式导入导出

《SpringBoot+EasyExcel实现自定义复杂样式导入导出》这篇文章主要为大家详细介绍了SpringBoot如何结果EasyExcel实现自定义复杂样式导入导出功能,文中的示例代码讲解详细,... 目录安装处理自定义导出复杂场景1、列不固定,动态列2、动态下拉3、自定义锁定行/列,添加密码4、合并

SpringBoot中如何使用Assert进行断言校验

《SpringBoot中如何使用Assert进行断言校验》Java提供了内置的assert机制,而Spring框架也提供了更强大的Assert工具类来帮助开发者进行参数校验和状态检查,下... 目录前言一、Java 原生assert简介1.1 使用方式1.2 示例代码1.3 优缺点分析二、Spring Fr

Java实现自定义table宽高的示例代码

《Java实现自定义table宽高的示例代码》在桌面应用、管理系统乃至报表工具中,表格(JTable)作为最常用的数据展示组件,不仅承载对数据的增删改查,还需要配合布局与视觉需求,而JavaSwing... 目录一、项目背景详细介绍二、项目需求详细介绍三、相关技术详细介绍四、实现思路详细介绍五、完整实现代码

一文详解Java Stream的sorted自定义排序

《一文详解JavaStream的sorted自定义排序》Javastream中的sorted方法是用于对流中的元素进行排序的方法,它可以接受一个comparator参数,用于指定排序规则,sorte... 目录一、sorted 操作的基础原理二、自定义排序的实现方式1. Comparator 接口的 Lam

Spring如何使用注解@DependsOn控制Bean加载顺序

《Spring如何使用注解@DependsOn控制Bean加载顺序》:本文主要介绍Spring如何使用注解@DependsOn控制Bean加载顺序,具有很好的参考价值,希望对大家有所帮助,如有错误... 目录1.javascript 前言2. 代码实现总结1. 前言默认情况下,Spring加载Bean的顺

Spring @Scheduled注解及工作原理

《Spring@Scheduled注解及工作原理》Spring的@Scheduled注解用于标记定时任务,无需额外库,需配置@EnableScheduling,设置fixedRate、fixedDe... 目录1.@Scheduled注解定义2.配置 @Scheduled2.1 开启定时任务支持2.2 创建