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

相关文章

SpringRetry重试机制之@Retryable注解与重试策略详解

《SpringRetry重试机制之@Retryable注解与重试策略详解》本文将详细介绍SpringRetry的重试机制,特别是@Retryable注解的使用及各种重试策略的配置,帮助开发者构建更加健... 目录引言一、SpringRetry基础知识二、启用SpringRetry三、@Retryable注解

SpringValidation数据校验之约束注解与分组校验方式

《SpringValidation数据校验之约束注解与分组校验方式》本文将深入探讨SpringValidation的核心功能,帮助开发者掌握约束注解的使用技巧和分组校验的高级应用,从而构建更加健壮和可... 目录引言一、Spring Validation基础架构1.1 jsR-380标准与Spring整合1

SpringBoot条件注解核心作用与使用场景详解

《SpringBoot条件注解核心作用与使用场景详解》SpringBoot的条件注解为开发者提供了强大的动态配置能力,理解其原理和适用场景是构建灵活、可扩展应用的关键,本文将系统梳理所有常用的条件注... 目录引言一、条件注解的核心机制二、SpringBoot内置条件注解详解1、@ConditionalOn

Mysql如何将数据按照年月分组的统计

《Mysql如何将数据按照年月分组的统计》:本文主要介绍Mysql如何将数据按照年月分组的统计方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录mysql将数据按照年月分组的统计要的效果方案总结Mysql将数据按照年月分组的统计要的效果方案① 使用 DA

SpringBoot利用@Validated注解优雅实现参数校验

《SpringBoot利用@Validated注解优雅实现参数校验》在开发Web应用时,用户输入的合法性校验是保障系统稳定性的基础,​SpringBoot的@Validated注解提供了一种更优雅的解... 目录​一、为什么需要参数校验二、Validated 的核心用法​1. 基础校验2. php分组校验3

Spring Security方法级安全控制@PreAuthorize注解的灵活运用小结

《SpringSecurity方法级安全控制@PreAuthorize注解的灵活运用小结》本文将带着大家讲解@PreAuthorize注解的核心原理、SpEL表达式机制,并通过的示例代码演示如... 目录1. 前言2. @PreAuthorize 注解简介3. @PreAuthorize 核心原理解析拦截与

SpringCloud动态配置注解@RefreshScope与@Component的深度解析

《SpringCloud动态配置注解@RefreshScope与@Component的深度解析》在现代微服务架构中,动态配置管理是一个关键需求,本文将为大家介绍SpringCloud中相关的注解@Re... 目录引言1. @RefreshScope 的作用与原理1.1 什么是 @RefreshScope1.

使用Sentinel自定义返回和实现区分来源方式

《使用Sentinel自定义返回和实现区分来源方式》:本文主要介绍使用Sentinel自定义返回和实现区分来源方式,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教... 目录Sentinel自定义返回和实现区分来源1. 自定义错误返回2. 实现区分来源总结Sentinel自定

Java进行文件格式校验的方案详解

《Java进行文件格式校验的方案详解》这篇文章主要为大家详细介绍了Java中进行文件格式校验的相关方案,文中的示例代码讲解详细,感兴趣的小伙伴可以跟随小编一起学习一下... 目录一、背景异常现象原因排查用户的无心之过二、解决方案Magandroidic Number判断主流检测库对比Tika的使用区分zip

Spring事务中@Transactional注解不生效的原因分析与解决

《Spring事务中@Transactional注解不生效的原因分析与解决》在Spring框架中,@Transactional注解是管理数据库事务的核心方式,本文将深入分析事务自调用的底层原理,解释为... 目录1. 引言2. 事务自调用问题重现2.1 示例代码2.2 问题现象3. 为什么事务自调用会失效3