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包下。
三.用法
引入依赖:
javax.validation
validation-api
org.hibernate
hibernate-validator
手动添加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,调用方法时自动拦截。
以上就是本文的全部内容,希望对大家的学习有所帮助,也希望大家多多支持脚本之家。
java 入参校验_Java Validation方法入参校验实现过程解析相关推荐
- aspect 方法入参 获取_谈谈Spring AOP中@Aspect的高级用法示例
前言 本文主要跟大家分享介绍了关于Spring AOP中@Aspect的高级用法,下面话不多说了,来随着小编一起看看详细的介绍吧. 1 切点复合运算 支持在切点定义中加入以下运算符进行复合运算: 运算 ...
- aop 获取方法入参出参_ASM字节码编程 | JavaAgent+ASM字节码插桩采集方法名称及入参和出参结果并记录方法耗时...
作者:小傅哥 博客:bugstack.cn ❝ 沉淀.分享.成长,让自己和他人都能有所收获! ❞ 一.前言 在我们实际的业务开发到上线的过程中,中间都会经过测试.那么怎么来保证测试质量呢?比如:提交了 ...
- 方法入参很复杂,每次调用都要构造BO入参?一招教你自动构造入参
场景 同在互联网打工的小伙伴们肯定都面临这样一种场景: 通用逻辑(被多处调用)我们通常会封装成一个方法,那这个方法入参正常来说都不会少,(在开发规范中,经常会看到一条"方法入参正常不超过3个 ...
- Spring-AOP @AspectJ进阶之绑定连接点方法入参
文章目录 概述 实例 概述 我们前面的博文在讲解切点函数时说过args().this().target().@args().@within().@target()和@annotation()这7个函数 ...
- aspectj 获取方法入参_深入探索编译插桩技术(二、AspectJ)
本文来自jsonchao的投稿,个人微信:bcce5360 现如今,编译插桩技术已经深入 Android 开发中的各个领域,而 AOP 技术正是一种高效实现插桩的模式,它的出现正好给处于黑暗中的我们带 ...
- Mybatis方法入参处理
1,在单个入参的情况下,mybatis不做任何处理,#{参数名} 即可,甚至连参数名都可以不需要,因为只有一个参数,或者使用 Mybatis的内置参数 _parameter. 2,多个入参: 接口方法 ...
- spring特殊字符转义和方法入参检测工具类
由于 Web 应用程序需要联合使用到多种语言,每种语言都包含一些特殊的字符,对于动态语言或标签式的语言而言,如果需要动态构造语言的内容时,一个我们经常会碰到的问题就是特殊字符转义的问题.下面是 Web ...
- 新版SpringCloudGateway网关 切面修改方法入参
通过注解修改方法入参值,一般都是采用实现 org.springframework.web.method.support.HandlerMethodArgumentResolver 接口的 resolv ...
- java操作es聚合操作并显示其他字段_java使用elasticsearch分组进行聚合查询过程解析...
这篇文章主要介绍了java使用elasticsearch分组进行聚合查询过程解析,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友可以参考下 java连接elas ...
最新文章
- 脂肪肝,应该拿你怎么办
- 成都有哪些牛逼的互联网公司?
- 304 Not Modified
- HikariCP--一款高性能的 JDBC 连接池
- 红米pro android 7,消费降级?红米Redmi Note 7Pro开箱以及简评
- 一个简单的epoll测试例子
- navicat使用触发器
- Android strings.xml中定义字符串显示空格
- ora-01189故障解决办法
- 机电大作业(第一阶段)
- Raspberry 4B
- clip_gradient_norms()
- Cesium.js解析第一篇 Cartesian3
- grub error: unknown filesystem的解决办法
- python大赛对名_用100行Python爬虫代码抓取公开的足球数据玩(一)
- make: 放弃循环依赖 问题解决(3d 重建)
- redhat linux 安装 gcc编译器
- cisco配置三台静态路由
- 关于磁盘阵列和LVM
- 文件后缀名大全及其说明表