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使用注解集成Redis缓存的示例代码

《SpringBoot使用注解集成Redis缓存的示例代码》:本文主要介绍在SpringBoot中使用注解集成Redis缓存的步骤,包括添加依赖、创建相关配置类、需要缓存数据的类(Tes... 目录一、创建 Caching 配置类二、创建需要缓存数据的类三、测试方法Spring Boot 熟悉后,集成一个外

使用C#如何创建人名或其他物体随机分组

《使用C#如何创建人名或其他物体随机分组》文章描述了一个随机分配人员到多个团队的代码示例,包括将人员列表随机化并根据组数分配到不同组,最后按组号排序显示结果... 目录C#创建人名或其他物体随机分组此示例使用以下代码将人员分配到组代码首先将lstPeople ListBox总结C#创建人名或其他物体随机分组

SpringBoot 自定义消息转换器使用详解

《SpringBoot自定义消息转换器使用详解》本文详细介绍了SpringBoot消息转换器的知识,并通过案例操作演示了如何进行自定义消息转换器的定制开发和使用,感兴趣的朋友一起看看吧... 目录一、前言二、SpringBoot 内容协商介绍2.1 什么是内容协商2.2 内容协商机制深入理解2.2.1 内容

spring 参数校验Validation示例详解

《spring参数校验Validation示例详解》Spring提供了Validation工具类来实现对客户端传来的请求参数的有效校验,本文给大家介绍spring参数校验Validation示例详... 目录前言一、Validation常见的校验注解二、Validation的简单应用三、分组校验四、自定义校

使用@Slf4j注解,log.info()无法使用问题

《使用@Slf4j注解,log.info()无法使用问题》在使用Lombok的@Slf4j注解打印日志时遇到问题,通过降低Lombok版本(从1.18.x降至1.16.10)解决了问题... 目录@Slf4androidj注解,log.info()无法使用问题最后解决总结@Slf4j注解,log.info(

【前端学习】AntV G6-08 深入图形与图形分组、自定义节点、节点动画(下)

【课程链接】 AntV G6:深入图形与图形分组、自定义节点、节点动画(下)_哔哩哔哩_bilibili 本章十吾老师讲解了一个复杂的自定义节点中,应该怎样去计算和绘制图形,如何给一个图形制作不间断的动画,以及在鼠标事件之后产生动画。(有点难,需要好好理解) <!DOCTYPE html><html><head><meta charset="UTF-8"><title>06

自定义类型:结构体(续)

目录 一. 结构体的内存对齐 1.1 为什么存在内存对齐? 1.2 修改默认对齐数 二. 结构体传参 三. 结构体实现位段 一. 结构体的内存对齐 在前面的文章里我们已经讲过一部分的内存对齐的知识,并举出了两个例子,我们再举出两个例子继续说明: struct S3{double a;int b;char c;};int mian(){printf("%zd\n",s

Spring 源码解读:自定义实现Bean定义的注册与解析

引言 在Spring框架中,Bean的注册与解析是整个依赖注入流程的核心步骤。通过Bean定义,Spring容器知道如何创建、配置和管理每个Bean实例。本篇文章将通过实现一个简化版的Bean定义注册与解析机制,帮助你理解Spring框架背后的设计逻辑。我们还将对比Spring中的BeanDefinition和BeanDefinitionRegistry,以全面掌握Bean注册和解析的核心原理。

Solr 使用Facet分组过程中与分词的矛盾解决办法

对于一般查询而言  ,  分词和存储都是必要的  .  比如  CPU  类型  ”Intel  酷睿  2  双核  P7570”,  拆分成  ”Intel”,”  酷睿  ”,”P7570”  这样一些关键字并分别索引  ,  可能提供更好的搜索体验  .  但是如果将  CPU  作为 Facet  字段  ,  最好不进行分词  .  这样就造成了矛盾  ,  解决方法

Oracle type (自定义类型的使用)

oracle - type   type定义: oracle中自定义数据类型 oracle中有基本的数据类型,如number,varchar2,date,numeric,float....但有时候我们需要特殊的格式, 如将name定义为(firstname,lastname)的形式,我们想把这个作为一个表的一列看待,这时候就要我们自己定义一个数据类型 格式 :create or repla