首页 > 其他分享 >【无标题】

【无标题】

时间:2024-06-10 09:02:13浏览次数:25  
标签:age 校验 无标题 System Validator println out

作者:
链接:https://juejin.cn/post/7347989108172128282
来源:稀土掘金
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。


上篇文章 中我们介绍了如何自定义Springboot参数约束注解和约束校验器,默认情况下,Springboot中的参数校验都是在Controller控制层完成的,那如果我们想要在非Controller控制层 进行参数校验要怎么办呢?本文将介绍非Controller控制层 参数校验的方法。

看源码

从上篇文章中我们知道Spring提供了JSR-303 的一个变种 @Validated ,下面我们看一下 @Validated 的部分源码。

Validator

看注释官方是让我们去看看Validator#validate() 方法,官方让我看我们就去看呗,索性直接看Validator 源码:

public interface Validator {

	<T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups);

	<T> Set<ConstraintViolation<T>> validateProperty(T object,
													 String propertyName,
													 Class<?>... groups);

	<T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType,
												  String propertyName,
												  Object value,
												  Class<?>... groups);

	BeanDescriptor getConstraintsForClass(Class<?> clazz);

	<T> T unwrap(Class<T> type);

	ExecutableValidator forExecutables();
}

Validator是做什么用的呢?

Validator 接口 定义了用于执行验证的方法,用于验证对象的字段值是否符合指定的约束条件。 它主要提供了以下几个核心方法:

  1. <T> Set<ConstraintViolation<T>> validate(T object, Class<?>... groups)

    • 该方法用于验证给定对象是否符合指定的约束条件。
    • 参数 object是要验证的对象,参数 groups可选,表示验证组。
    • 返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。
  2. <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups)

    • 该方法用于验证给定对象的特定属性是否符合指定的约束条件。
    • 参数 object是要验证的对象,参数 propertyName是属性名,参数 groups可选,表示验证组。
    • 返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。
  3. <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups)

    • 该方法用于验证给定属性值是否符合指定的约束条件,而不需要实际创建对象实例。
    • 参数 beanType是对象类型,参数 propertyName是属性名,参数 value是属性值,参数 groups可选,表示验证组。
    • 返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。

这些方法能够对 Java 对象进行全面的验证,从整个对象级别到单个属性值的验证,都可以通过 Validator 接口提供的方法来实现。

实操

从上面的介绍我们可以看到,实际上参数校验是通过 Validator 接口的实现类来验证的。 下面我们通过代码来看一下 Validator 接口怎么用?

先把我们的老演员拿出来,下面再校验就用它了。

@Data
public class UserBean {

    @NotBlank
    private String username;

    @Min(value = 18)
    private Integer age;
}

依赖Spring 容器

JSR 303 提供了 Validator 接口作为规范接口,用于实现数据校验功能。在实际应用中,我们并不需要自己从头开始实现这一接口,因为已经有官方参考实现——Hibernate Validator。Spring 框架作为广泛使用的Java开发框架,自然也遵循这一原则,它并没有重复造轮子,而是采用了 Hibernate Validator 的实现来支持校验功能。

因此,当我们使用 Spring 框架进行开发时,通常意味着我们可以直接利用 Spring 提供的集成,将 Validator 接口注入到我们的组件中,然后方便地使用它来进行数据校验。

下面来看下如何在Springboot中使用 Validator 接口。

@SpringBootTest
class SpringbootPracticeApplicationTests {
	@Resource
    private Validator validator;

	@Test
    public void testValidator(){
        UserBean userBean = new UserBean();
        userBean.setAge(17);
        userBean.setUsername(null);

        Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
        System.out.println("validate 校验对象属性:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateProperty(userBean, "age");
        System.out.println("validateProperty校验age属性是否合规:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
        System.out.println("validateValue校验age属性的值是否合规:");
        System.out.println(constraintViolations);
    }
}

测试结果:

validate 校验对象属性:
[ConstraintViolationImpl{interpolatedMessage='不能为空', propertyPath=username, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.NotBlank.message}'}, 
ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateProperty校验age属性是否合规:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateValue校验age属性的值是否合规:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

从打印结果中可以发现具体是哪些字段约束不通过、具体的提示信息都有。

不依赖Spring 容器

JSR 303 是一种规范,意味着它 不依赖Spring 容器 ,能用Java的地方都可以用它,那如果我们在非Spring框架的项目中怎么使用它呢?

其实,最主要的是能获取到 Validator 接口的实现,然后就可以进行验证了。 Validator 接口的实现可以通过如下代码获取,前提是要引入 Hibernate Validator 的依赖或者自己重新造轮子实现Validator 接口。

public class ValidationUtils {

    public static Validator getValidator(){
        ValidatorFactory factory = Validation.buildDefaultValidatorFactory();
        return factory.getValidator();
    }
}
/**
 * @author 公众号-索码理(suncodernote)
 */
public class ValidatorTest {
    public static void main(String[] args) {
        Validator validator = ValidationUtils.getValidator();

        UserBean userBean = new UserBean();
        userBean.setAge(17);
        userBean.setUsername(null);

        Set<ConstraintViolation<UserBean>> constraintViolations = validator.validate(userBean);
        System.out.println("validate 校验对象属性:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateProperty(userBean, "age");
        System.out.println("validateProperty校验age属性是否合规:");
        System.out.println(constraintViolations);
        System.out.println();

        constraintViolations = validator.validateValue(UserBean.class , "age", 14 );
        System.out.println("validateValue校验age属性的值是否合规:");
        System.out.println(constraintViolations);
    }
}

打印结果:

23:57:10.700 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator 8.0.1.Final
validate 校验对象属性:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}, 
ConstraintViolationImpl{interpolatedMessage='不能为空', propertyPath=username, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.NotBlank.message}'}]

validateProperty校验age属性是否合规:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

validateValue校验age属性的值是否合规:
[ConstraintViolationImpl{interpolatedMessage='最小不能小于18', propertyPath=age, rootBeanClass=class site.suncodernote.validation.UserBean, messageTemplate='{jakarta.validation.constraints.Min.message}'}]

可以看到 依赖Spring 容器不依赖Spring 容器 ,两者的调用结果都是相同的,不同之处就在于 Validator 的获取,前者直接从 Spring 容器 获取,后者需要通过工厂类获取,适用范围更广一点,在Spring框架中也能使用。

总结

本文介绍了在非Controller控制层参数校验的两种方法,不管是哪种获取方法只要能达到结果就行,不过建议使用后者,可以把后者封装成工具类,统一管理校验方法。

标签:age,校验,无标题,System,Validator,println,out
From: https://blog.csdn.net/m0_50116974/article/details/139562613

相关文章

  • 【无标题】
    作者:萤火架构链接:https://juejin.cn/post/7337513754970095667#heading-0来源:稀土掘金著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。最近看几个老项目的SQL条件中使用了1=1,想想自己也曾经这样写过,略有感触,特别拿出来说道说道。编写SQL语句就......
  • 【无标题】
    AtmosphericToolboxHARPHARP介绍及安装基本介绍HARP文档安装可能遇到的问题HARP介绍及安装HARP是用于读取、处理和比较卫星遥感数据、模型数据、原位数据和地面遥感数据的一个工具包。基本介绍链接:https://atmospherictoolbox.org/harp/HARP工具包由一组命令行......
  • 【无标题】
    开源大模型与闭源大模型,你更看好哪一方?本人业余小白,浅浅的讲述一下我的观点。一:数据隐私关于数据隐私这一块,我更看好闭源大模型,因为闭源大模型并不像开源大模型一样容易扒取数据。二:商业应用这玩意我个人认为主要分两块一是隐私这一块那肯定是闭源跟好一点。二呢开源......
  • 【无标题】
    操作系统实验报告4实验四 内存分配器的实现实习编号:操作系统实验_实验_4实习名称:内存分配器的实现巩固知识点了解并熟悉Linux操作系统的常用命令操作;了解基于Linux的功能开发。实习对应培养点学习使用Linux环境编写C程序;学习内存管理的开发相关知识。实验目的熟悉掌握......
  • 【无标题】
    CSS选择器以及权重问题选择器:就是给标签取名字一、选择器的类型1、标签(类型)选择器:(权重为1)标签选择器可以对所有的同类标签起作用,对应标签div/p/i/strong语法:标签{属性:属性值;}应用场景:需要统一或者清除标签内容的样式时;2、id选择器:(权重为100)语法:在标签内给用id给标......
  • 【无标题】基于[具体技术]的烟雾识别算法研究
    本文主要探讨了一种高效的烟雾识别算法,通过对[相关技术或特征]的分析和利用,实现了对烟雾的准确检测和识别。详细介绍了算法的原理、流程以及实验结果,并结合实际应用案例展示了其应用价值。一、引言(阐述烟雾识别的重要性及应用场景)二、相关工作(回顾以往烟雾识别算法的研究......
  • 【无标题】
    Web_Person简单的制作一个个人主页。在这里面我们需要制作一个表头,Tabs导航栏。这个·做的比较简单,所以比较复杂的东西。表头先自定义一个组件制作表头,这里面的使用的Text、Image和Button组件。并且我们需要在Texr添加点击事件:页面返回到上一级。@Componentstruct Head1......
  • 【无标题】Spark基础编程
    一、创建RDD    1.从内存中创建RDD      (1)parallelize()方法       (2)makeRDD()方法通过Linux本地文件创建RDD 二,使用map方式转换数据  使用sortBy方式转换数据  用collect方法查询数据flat方法转换数据 take方法 ......
  • 【无标题】
    #设计猫类,属性有种类|、颜色、年龄和体重,方法有输出猫的信息、猫发出叫声、猫玩东西packagedemo;classCat{privateStringspecies;//种类privateStringcolor;//颜色privateintage;//年龄privatedoubleweight;//体重//构造......
  • 【无标题】idea 中 SpringBoot 点击运行没反应,按钮成灰色
    问题描述在使用SpringBoot开发项目时,可能会遇到一个问题:点击运行按钮后,控制台没有任何输出,项目界面也没有显示。这种情况可能是由多种原因导致的,本文将介绍一些常见的解决方法。解决方法首先看下Groovy插件是否选择,取消选择1.检查端口是否被占用首先,我们需要检查应用程......