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
![](https://www.aspxhome.com/images/zang.png)
![](https://www.aspxhome.com/images/jiucuo.png)
猜你喜欢
- Java8Stream流操作List去重根据属性去重整体去重使用distinctArrayList<LabelInfoDTO>
- 目录前言实践部分测试部分总结前言今天跟小伙伴们分享一个实战内容,使用Spring Boot+Shiro实现一个简单的Http认证。场景是这样
- 前言在实际项目开发中,会碰到这样的问题,数据库表结构设计好了,可实体类还没相应地弄出来。实体类的属性命名方法一般是驼峰法,而数据库中的表字段
- 一、注解是什么Java 注解用于为 Java 代码提供元数据,看完这句话也许你还是一脸懵逼,用人话说就是注解不直接影响你的代码执行,仅提供信
- 一、是什么当下很多公司都采取前后端分离的开发模式,前端和后端的工作由不同的工程师完成。在这种开发模式下,维持一份及时更新且完整的 Rest
- 实例如下所示:public class MainActivity {private static final String fileName
- JDK提供的流继承了四大类:InputStream(字节输入流)、OutputStream(字节输出流)、Reader(字符输入流)、Wri
- spring mvc中的@PathVariable是用来获得请求url中的动态参数的,十分方便,复习下: @Controller publ
- 项目里使用了Feign进行远程调用,有时为了问题排查,需要开启请求和响应日志下面简介一下如何开启Feign日志:注:本文基于spring-b
- 前言在项目中,如果我们要遵循分层领域模型规约: 话,肯定避免不了在DTO、VO、BO、AO、VO、Query等实体的转换,我们通常有几种做法
- 前言一个说难不难,说简单竟看不出来是哪里问题的一个bug。是的 可能自己能力和经验尚浅无法识别,下面你们能否用火眼金睛一眼让bug原形毕露(
- 自己写了一个Swap测试类,代码如下:swap不能交换原生数据类型以及字符串类型。public class Swap5{ public st
- 最近的一个接口项目,传的参数要求是json,需要特殊处理一下。重点是这两句话:httpPost.setHeader("Conten
- Java 中的 BIO、NIO和 AIO 理解为是 Java 语言对操作系统的各种 IO 模型的封装。程序员在使用这些 API 的时候,不需
- 序列化和反序列化Java是面向对象的语言,与其他语言进行交互(比如与前端js进行http通信),需要把对象转化成一种通用的格式比如json(
- 需求: 使用IO流将指定目录下的若干个音频文件的高潮部分,进行剪切,并重新拼接成一首新的音频文件 思路(以两首歌为例):第一首歌有
- 简介在文章《GraalVM和Spring Native尝鲜,一步步让Springboot启动飞起来,66ms完成启动》中,我们介绍了如何使用
- 本文实例为大家分享了springmvc实现验证码功能展示的具体代码,供大家参考,具体内容如下先看效果图: 思路: 首先验证码是一张图片,是一
- timer的schedule和scheduleAtFixedRate方法一般情况下是没什么区别的,只在某个情况出现时会有区别--当前任务没有
- struts2可以非常简单地使用FreeMarker模板作为视图技术,对于传统的jsp页面而言,FreeMarker是一个绝佳的替代方案。除