Java Validation方法入参校验实现过程解析

 更新时间:2020年11月18日 08:30:34   作者:鸟巢的Java成神之路  
这篇文章主要介绍了Java Validation方法入参校验实现过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下

一.前言

在日常的开发中,经常需要对方法参数进行校验(非空、长度等)。如果采用hardcode去校验(if..else..),会造成代码冗余,复用性低,导致维护成本比较高。借助Validation组件,可以很方便地通过注解来校验参数。

二.Java Validation组件

JSR

JSR 是一种规范标准,规定了一些校验规范的注解,位于javax.validation.constraints包下,只提供规范不提供实现,如@NotNull,@Size 等

Hibernate Validation

hibernate Validation 与 hibernate ORM框架没有半毛钱关系,它提供了JSR的实现,位于org.hibernate.validator.constraints包下。

三.用法

引入依赖:

<dependency>
<groupId>javax.validation</groupId>
<artifactId>validation-api</artifactId>
</dependency>
<dependency>
<groupId>org.hibernate</groupId>
<artifactId>hibernate-validator</artifactId>
</dependency>

手动添加bean :

对实体类添加注解:

@Data
publicclassPeople {
	@NotNull(message = "姓名不能为空")
	privateStringname;
	@Min(value = 1, message = "年龄不能小于1岁")
	privateInteger size;
}

Controller层上用法:

如果在Spring的Controller层引用以上Java Bean对象,则需要加上@Valid注解,用法如下:

@RestController
@RequestMapping("/api")
publicclassPeopleController {
	@Autowired
	privatePeopleService peopleService;
	@RequestMapping("/addPeople")
	publicStringaddPeople(@Valid@RequestBodyPeople people) {
		peopleService.addPeople(people);
		return"ok";
	}
}

Service层上用法:

@Valid注解,当我们用Service接口层的时候,会发现参数校验逻辑是不生效的。要向让@Valid注解在controller层以外的地方生效,必须配合@Validated来使用。这是因为Spring给我们创建了一个用于参数校验的AOP切面逻辑,过滤方式就是class被@Validated修饰的bean对象。所以我们可以使用@Validated来修饰我们的service层实现类:

@Validated
 public interface PeopleService {
 voidaddPeople(@ValidPeople people);
}


Controller层不需要@Validated注解是因为在Spring的controller层有数据绑定和校验的过程,默认就会对@Valid修饰的方法参数使用Validator来做校验逻辑。

四.原理

1.利用Spring ioc,注入MethodValidationPostProcessor和LocalValidatorFactoryBean。

2.利用Spring ioc提供的扩展点(BeanPostProcessor, InitializingBean),初始化拦截器MethodValidationInterceptor

3.MethodValidationPostProcessor用来生成和植入拦截器MethodValidationInterceptor,调用方法时自动拦截。

以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。

相关文章

  • Spring IOC容器Bean管理XML注入集合类型属性

    Spring IOC容器Bean管理XML注入集合类型属性

    这篇文章主要为大家介绍了Spring IOC容器Bean管理XML注入集合类型属性,有需要的朋友可以借鉴参考下,希望能够有所帮助,祝大家多多进步,早日升职加薪
    2022-05-05
  • mybatis 为什么千万不要使用 where 1=1

    mybatis 为什么千万不要使用 where 1=1

    这篇文章主要介绍了mybatis 为什么千万不要使用 where 1=1,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-05-05
  • 如何利用Java使用AOP实现数据字典转换

    如何利用Java使用AOP实现数据字典转换

    这篇文章主要介绍了如何利用Java使用AOP实现数据字典转换,AOP也是我们常说的面向切面编程,AOP在我们开发过程中应用也比较多,在这里我们就基于AOP来实现一个数据字典转换的案例
    2022-06-06
  • Mybatis实体类对象入参查询的笔记

    Mybatis实体类对象入参查询的笔记

    这篇文章主要介绍了Mybatis实体类对象入参查询的笔记,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2022-06-06
  • Log4j 配置日志打印时区的实现方法

    Log4j 配置日志打印时区的实现方法

    下面小编就为大家分享一篇Log4j 配置日志打印时区的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2017-12-12
  • Java使用easyExcel导出数据及单元格多张图片

    Java使用easyExcel导出数据及单元格多张图片

    除了平时简单的数据导出需求外,我们也经常会遇到一些有固定格式或者模板要求的数据导出,下面这篇文章主要给大家介绍了关于Java使用easyExcel导出数据及单元格多张图片的相关资料,需要的朋友可以参考下
    2023-05-05
  • 2021年最新Redis面试题汇总(4)

    2021年最新Redis面试题汇总(4)

    在程序员面试过程中redis相关的知识是常被问到的话题。这篇文章主要介绍了几道Redis面试题,整理一下分享给大家,感兴趣的小伙伴们可以参考一下
    2021-07-07
  • 浅谈java中==以及equals方法的用法

    浅谈java中==以及equals方法的用法

    这篇文章主要介绍了浅谈java中==以及equals方法的用法,涉及二者的用法示例,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • springboot网站应用使用第三方qq登录的实现过程

    springboot网站应用使用第三方qq登录的实现过程

    这篇文章主要介绍了springboot网站应用使用第三方qq登录,本文通过实例图文相结合给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2021-09-09
  • Java FileDescriptor总结_动力节点Java学院整理

    Java FileDescriptor总结_动力节点Java学院整理

    FileDescriptor 是“文件描述符”。可以被用来表示开放文件、开放套接字等。接下来通过本文给大家分享Java FileDescriptor总结,感兴趣的朋友一起学习吧
    2017-05-05

最新评论