当前位置:首页 > 科技  > 软件

非Controller控制层参数校验要怎么做

来源: 责编: 时间:2024-03-26 09:34:47 290观看
导读上篇文章中我们介绍了如何自定义Springboot参数约束注解和约束校验器,默认情况下,Springboot中的参数校验都是在Controller控制层完成的,那如果我们想要在非Controller控制层 进行参数校验要怎么办呢?本文将介绍非Control

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

看源码

从上篇文章中我们知道Spring提供了JSR-303 的一个变种  @Validated  ,下面我们看一下 @Validated 的部分源码。RDn28资讯网——每日最新资讯28at.com

图片图片RDn28资讯网——每日最新资讯28at.com

Validator

看注释官方是让我们去看看Validator#validate() 方法,官方让我看我们就去看呗,索性直接看Validator 源码:RDn28资讯网——每日最新资讯28at.com

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是做什么用的呢?RDn28资讯网——每日最新资讯28at.com

Validator 接口 定义了用于执行验证的方法,用于验证对象的字段值是否符合指定的约束条件。它主要提供了以下几个核心方法:RDn28资讯网——每日最新资讯28at.com

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

该方法用于验证给定对象是否符合指定的约束条件。RDn28资讯网——每日最新资讯28at.com

参数 object是要验证的对象,参数 groups可选,表示验证组。RDn28资讯网——每日最新资讯28at.com

返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。RDn28资讯网——每日最新资讯28at.com

  1. <T> Set<ConstraintViolation<T>> validateProperty(T object, String propertyName, Class<?>... groups):
  • 该方法用于验证给定对象的特定属性是否符合指定的约束条件。RDn28资讯网——每日最新资讯28at.com

  • 参数 object是要验证的对象,参数 propertyName是属性名,参数 groups可选,表示验证组。RDn28资讯网——每日最新资讯28at.com

  • 返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。RDn28资讯网——每日最新资讯28at.com

  1. RDn28资讯网——每日最新资讯28at.com

    <T> Set<ConstraintViolation<T>> validateValue(Class<T> beanType, String propertyName, Object value, Class<?>... groups):RDn28资讯网——每日最新资讯28at.com

    RDn28资讯网——每日最新资讯28at.com

  • 该方法用于验证给定属性值是否符合指定的约束条件,而不需要实际创建对象实例。RDn28资讯网——每日最新资讯28at.com

  • 参数 beanType是对象类型,参数 propertyName是属性名,参数 value是属性值,参数 groups可选,表示验证组。RDn28资讯网——每日最新资讯28at.com

  • 返回一个 Set 集合,其中包含违反约束条件的 ConstraintViolation 对象。RDn28资讯网——每日最新资讯28at.com

这些方法能够对 Java 对象进行全面的验证,从整个对象级别到单个属性值的验证,都可以通过 Validator 接口提供的方法来实现。RDn28资讯网——每日最新资讯28at.com

实操

从上面的介绍我们可以看到,实际上参数校验是通过 Validator 接口的实现类来验证的。下面我们通过代码来看一下 Validator 接口怎么用?RDn28资讯网——每日最新资讯28at.com

先把我们的老演员拿出来,下面再校验就用它了。RDn28资讯网——每日最新资讯28at.com

@Datapublic class UserBean {    @NotBlank    private String username;    @Min(value = 18)    private Integer age;}

依赖Spring 容器

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

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

下面来看下如何在Springboot中使用 Validator 接口。RDn28资讯网——每日最新资讯28at.com

@SpringBootTestclass 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);    }}

测试结果:RDn28资讯网——每日最新资讯28at.com

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}'}]

从打印结果中可以发现具体是哪些字段约束不通过、具体的提示信息都有。RDn28资讯网——每日最新资讯28at.com

不依赖Spring 容器

JSR 303  是一种规范,意味着它 不依赖Spring 容器 ,能用Java的地方都可以用它,那如果我们在非Spring框架的项目中怎么使用它呢?RDn28资讯网——每日最新资讯28at.com

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

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);    }}

打印结果:RDn28资讯网——每日最新资讯28at.com

23:57:10.700 [main] INFO org.hibernate.validator.internal.util.Version -- HV000001: Hibernate Validator 8.0.1.Finalvalidate 校验对象属性:[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框架中也能使用。RDn28资讯网——每日最新资讯28at.com

总结

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

本文链接:http://www.28at.com/showinfo-26-79295-0.html非Controller控制层参数校验要怎么做

声明:本网页内容旨在传播知识,若有侵权等问题请及时与本网联系,我们将在第一时间删除处理。邮件:2376512515@qq.com

上一篇: 现代WPF界面轻松实现:探秘轻量级WPFUI库,MVVM与依赖注入一体化

下一篇: Spring Boot整合Camunda打造高效工作流程

标签:
  • 热门焦点
  • 鸿蒙OS 4.0公测机型公布:甚至连nova6都支持

    华为全新的HarmonyOS 4.0操作系统将于今天下午正式登场,官方在发布会之前也已经正式给出了可升级的机型产品,这意味着这些机型会率先支持升级享用。这次的HarmonyOS 4.0支持
  • 官方承诺:K60至尊版将会首批升级MIUI 15

    全新的MIUI 15今天也有了消息,在官宣了K60至尊版将会搭载天玑9200+处理器和独显芯片X7的同时,Redmi给出了官方承诺,K60至尊重大更新首批升级,会首批推送MIUI 15。也就是说虽然
  • 小米平板5 Pro 12.4简评:多专多能 兼顾影音娱乐的大屏利器

    疫情带来了网课,网课盘活了安卓平板,安卓平板市场虽然中途停滞了几年,但好的一点就是停滞的这几年行业又有了新的发展方向,例如超窄边框、高刷新率、多摄镜头组合等,这就让安卓
  • 石头自清洁扫拖机器人G10S评测:多年黑科技集大成之作 懒人终极福音

    科技圈经常能看到一个词叫“缝合怪”,用来形容那些把好多功能或者外观结合在一起的产品,通常这样的词是贬义词,但如果真的是产品缝合的好、缝合的实用的话,那它就成了中性词,今
  • K6:面向开发人员的现代负载测试工具

    K6 是一个开源负载测试工具,可以轻松编写、运行和分析性能测试。它建立在 Go 和 JavaScript 之上,它被设计为功能强大、可扩展且易于使用。k6 可用于测试各种应用程序,包括 Web
  • 如何通过Python线程池实现异步编程?

    线程池的概念和基本原理线程池是一种并发处理机制,它可以在程序启动时创建一组线程,并将它们置于等待任务的状态。当任务到达时,线程池中的某个线程会被唤醒并执行任务,执行完任
  • 大厂卷向扁平化

    来源:新熵作者丨南枝 编辑丨月见大厂职级不香了。俗话说,兵无常势,水无常形,互联网企业调整职级体系并不稀奇。7月13日,淘宝天猫集团启动了近年来最大的人力制度改革,目前已形成一
  • 疑似小米14外观设计图曝光:后置相机模组变化不大

    下半年的大幕已经开启,而谁将成为下半年手机圈的主角就成为了大家关注的焦点,其中被传有望拿下新一代骁龙8 Gen3旗舰芯片的小米14系列更是备受大家瞩
  • 2299元起!iQOO Pad开启预售:性能最强天玑平板

    5月23日,iQOO如期举行了新品发布会,除了首发安卓最强旗舰处理器的iQOO Neo8系列新机外,还在发布会上推出了旗下首款平板电脑——iQOO Pad,其搭载了天玑
Top