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

作者:鸟巢的Java成神之路 时间:2021-08-04 03:31:50 

一.前言

在日常的开发中,经常需要对方法参数进行校验(非空、长度等)。如果采用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,调用方法时自动拦截。

来源:https://www.cnblogs.com/niaochao/p/13936912.html

标签:Java,Validation,方法,入参,校验
0
投稿

猜你喜欢

  • SpringBoot实现PPT格式文件上传并在线预览功能

    2023-07-22 14:44:56
  • Java 集合框架之List 的使用(附小游戏练习)

    2023-11-24 10:33:40
  • Java虚拟机内存结构及编码实战分享

    2023-11-29 13:47:47
  • Java使用BigDecimal进行运算封装的实际案例

    2023-06-20 02:22:26
  • Java接口的作用_动力节点Java学院整理

    2021-12-23 20:46:14
  • AsyncTask官方文档教程整理

    2023-07-31 20:25:08
  • SpringBoot如何获取Kafka的Topic列表

    2023-11-26 16:01:52
  • 详谈java 堆区、方法区和栈区

    2023-11-23 18:35:22
  • 浅谈JVM内存溢出原因和解决思路

    2023-11-23 12:24:15
  • Android Studio kotlin生成编辑类注释代码

    2023-06-16 12:03:20
  • Android中TextView动态设置缩进距离的方法

    2023-08-07 09:52:00
  • Kotlin中的惰性操作容器Sequence序列使用原理详解

    2023-10-01 14:21:55
  • 在IDEA里gradle配置和使用的方法步骤

    2023-11-23 16:07:58
  • 生产消费者模式实现方式和线程安全问题代码示例

    2023-11-26 19:44:17
  • Spring Security前后分离校验token的实现方法

    2023-06-26 17:00:30
  • Jenkins Pipeline 部署 SpringBoot 应用的教程详解

    2022-09-26 14:06:27
  • 将JavaDoc注释生成API文档的操作

    2023-06-16 18:24:06
  • SpringCloud Gateway HttpWebHandlerAdapter链路调用请求流程介绍

    2023-04-29 00:12:18
  • JVM 心得分享(加载 链接 初始化)

    2023-09-01 19:17:50
  • java中的this引用及对象构造初始化

    2023-03-07 09:38:17
  • asp之家 软件编程 m.aspxhome.com