Spring方法级别的验证
设置验证点及验证方式
(1)Spring方法级别的验证有多种验证方式,比较常用的有
@NotBlank:主要是对字符串的验证,不为null且去除空白符之后长度大于0
@NotNull:主要是对对象的验证,不为null,此处特别注意,当对int等类型进行验证时,需要使用这种方式,但是要使用int的封装类型Integer
@NotEmpty:主要是对集合类对象的验证,集合中元素的个数大于0
(2)Spring方法级别的验证可以验证的点示范用例如下(忽略import)
@Validated
public class Test() {
@NotBlank(message = "用户名不能为空")
private String usr; private int age; public void grow(
@NotNull(message = "增长的年龄不能为空") Integer ageAdd) {
age += ageAdd;
} public @NotNull Integer howOld() {
return age;
}
}
可以对属性、方法入参和返回值等进行验证。
开启验证处理
当对验证点进行验证之后,为了得到验证的结果,需要开启对验证结果的处理。在Spring3.1之后,只需要引入一个Bean即可,MethodValidationPostProcessor。根据spring的依赖注入方
式,可以采用xml配置,java配置的方式在spring自动注入时将MethodValidationPostProcessor注入到spring容器中,例如如下的java配置(忽略import):
@Configuration
public class beanConfig() { @Bean
public MethodValidationPostProcessor getBean() {
return new MethodValidationPostProcessor();
}
}
关于MethodValidationPostProcessor类的描述可自行阅读源码,在阅读源码时,我们可以看到MethodValidationPostProcessor类实现了InitializingBean接口,实现了InitializingBean
的afterPropertiesSet()方法,这是spring用于初始化的一个方法,在initial-method方法之前调用,值得深入研究。
回到开启验证处理,不仅需要引入MethodvalidationPostProcessor这个类,还需要在适当的地方添加@Validated注解,告诉MethodValidationPostProcessor这个类,此处需要验证结果处理。
@RequestParam与验证注解
在controller中可能会同时出现@RequestParam和验证的注解(@NotBlank、@NotNull等),如下例:
@RequestMapping("/index")
public String list(
@RequestParam(required = false, defaultValue = "") @NotBlank(message = "用户名不能为空") String usr)
/*
code
*/
}
解析:(1)如果url请求中有传参数,只需要验证@NotBlank;
(2)如果url请求中没有传参数,@RequestParam中只要有defaultValue,不管required是true还是false,参数的值都赋为defaultValue的值,再验证@NotBlank;
例:@ReuqstParam(required=true, defaulfValue"10011") @NotBlank(message="用户名不能为空") String usr
此时没有传参,usr为10011,虽然required值为true,但是不会报错。
(3)如果@RequestParam中required属性为true,没有defaultValue且url请求中没有传参,那么会返回@RequestParam的错误信息,不会返回@NotBlank的错误信息。
例:@RequestParam(required=true) @NotBlank(message = "用户名不能为空") String usr
此时没有传参,只会返回没有参数的错误。
注意:没有传参与没有参数值是有区别的,required限制的是url中有这个参数,参数的值是多少并不关心,如果没有值,会被赋值为null;@NotBlank限制的是参数的值不能为空(null或去除空白符长度为0)。没有传参,required=true时会报错,没有参数值,@NotBlank会报错。
Spring方法级别的验证的更多相关文章
- Spring方法级别数据校验:@Validated + MethodValidationPostProcessor
每篇一句 在<深度工作>中作者提出这么一个公式:高质量产出=时间*专注度.所以高质量的产出不是靠时间熬出来的,而是效率为王 相关阅读 [小家Java]深入了解数据校验:Java Bean ...
- Spring3.1 对Bean Validation规范的新支持(方法级别验证)
上接Spring提供的BeanPostProcessor的扩展点-1继续学习. 一.Bean Validation框架简介 写道Bean Validation standardizes constra ...
- Spring MVC 使用介绍(十五)数据验证 (二)依赖注入与方法级别验证
一.概述 JSR-349 (Bean Validation 1.1)对数据验证进一步进行的规范,主要内容如下: 1.依赖注入验证 2.方法级别验证 二.依赖注入验证 spring提供BeanValid ...
- Spring Security方法级别授权使用介绍
1.简介 简而言之,Spring Security支持方法级别的授权语义. 通常,我们可以通过限制哪些角色能够执行特定方法来保护我们的服务层 - 并使用专用的方法级安全测试支持对其进行测试. 在本文中 ...
- spring security 在controller层 方法级别使用注解 @PreAuthorize("hasRole('ROLE_xxx')")设置权限拦截 ,无权限则返回403
1.前言 以前学习的时候使用权限的拦截,一般都是对路径进行拦截 ,要么用拦截器设置拦截信息,要么是在配置文件内设置拦截信息, spring security 支持使用注解的形式 ,写在方法和接口上拦截 ...
- Spring中的@Transactional 放在 类级别 和 方法级别 上有什么不同?
Spring中的@Transactional 放在类级别 和 方法级别 上有什么不同? @Transactional放在类级别上是否等同于该类的每个方法都放上了@Transactional? 是的一般 ...
- Spring,AOP实现功能级别权限验证
1. 首先是问题出现的原因 对于一个我的一个个人博客网站,我希望游客可以浏览我的博客,但是评论功能是需要登录才能使用 这就需要对某个功能进行权限验证 对于过滤器,拦截器,AOP的区别日后再讨论,现在是 ...
- SpringBootSecurity学习(06)网页版登录方法级别的权限
用户授权 前面讨论过,Web应用的安全管理,主要包括两个方面的内容,一个是用户身份的认证,即用户登录的设计,二是用户授权,即一个用户在一个应用系统中能够执行哪些操作的权限管理.前面介绍了登录,下面简单 ...
- Spring Security 概念基础 验证流程
Spring Security 概念基础 验证流程 认证&授权 认证:确定是否为合法用户 授权:分配角色权限(分配角色,分配资源) 认证管理器(Authentication Manager) ...
随机推荐
- 启动OpenVPN失败
启动OpenVPN失败 文:铁乐与猫 [root@yunwei_OpenVPN openvpn]# systemctl status openvpn ● openvpn.service - LSB: ...
- <20180923>中秋节日期间的维护日志
(一) 陌生环境下断网是有风险的,提前做好准备. 1.1 某企业的机柜自2017年5月开始就没有作硬件更新和维护了: 趁着这次节日空挡可做一个机柜的重新整理维护: 首先看了下是老款某知名品牌的型号为6 ...
- LinkedList与ArrayList的区别
我们都知道LinkedList和ArrayList相比: 1.LinkedList插入删除相对较快,而查询较慢: 2.ArrayList插入删除相对较慢,而查询很快(详细可查看从源码的角度分析List ...
- python3 小数据池
'''小数据池:为了重复的使用同一个数据str(一般的,简单的)int -5~256bool True False3个数据类型会被放入小数据池id()取变量的内存地址字符串'''# s1 = &quo ...
- Selenium:三种等待方式
UI自动化测试,大多都是通过定位页面元素来模拟实际的生产场景操作.但在编写自动化测试脚本中,经常出现元素定位不到的情况,究其原因,无非两种情况:1.有frame:2.没有设置等待. 因为代码运行速度和 ...
- Volume is already attached by pod default/nginx-deployment-86dfb99868-szpkd. Status Running
1.部署WordPress - mysql ,想扩容,修改deployment,结果报错: MountVolume.SetUp failed for volume "pvc-e" ...
- element vuex 语音播报
data () { return { showDetail: false, height: 1, // 1 不可用 0 正常 2运维中 result: [], tableData: [], // 应用 ...
- java中的异常区分
在上图中,粉红色的部分为受检查的异常,其必须被try{}catch语句块所捕获,或者在方法中向外抛出异常 绿色的异常为运行时异常,需要程序员自行分辨是否要解决异常或者抛出异常,例空指针数组下标越界等等 ...
- session和cookie知识点总结
cookie小结:1.cookie是在服务端创建2.cooki是保存在浏览器这一端3.cookie的生命周期可以通过 cookie.setMaxAge(2000);(如果不设置生命周期,cookie的 ...
- Linux shell ftp命令下载文件 根据文件日期
需求:ftp获取远程数据的文件,根据文件的创建时间点下载文件. 可以自行扩展根据文件的大小等其他需求. 知识点总结: 1.获取文件的时间: ls -lrt|awk '{print $6" & ...