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) ...
随机推荐
- 如何在windows下使用pip安装
首先电脑已经安装好了python 找到python的安装目录,接着找到pip.exe,一般而言它会在Scripts文件夹下,我这里选择的是pip2.7.exe 接下来,win+r,输入cmd,回车打开 ...
- Linux 小知识翻译 - 「TCP/IP」
上次说了「协议」相关的话题,这次专门说说「TCP/IP」协议. 这里的主题是「TCP/IP」到底是什么?但并不是要说明「TCP/IP」是什么东西,重点是「TCP/IP」究竟有什么意义,在哪里使用「TC ...
- Beta冲刺博客集合贴
Beta阶段第一次冲刺 Beta阶段第二次冲刺 Beta阶段第三次冲刺 Beta阶段第四次冲刺 Beta阶段第五次冲刺 Beta阶段总结博客
- 命令行方式安装Pycharm
sudo apt install snapd snapd-xdg-open snap refresh sudo snap install pycharm-professional --classic
- MySQL视图 索引 存储过程 触发器 函数
视图: 也就是一个虚拟表(不是真实存在的),它的本质就是根据SQL语句获取动态的数据集,并为其命名.用户使用时只需要使用命名的视图即可获取结果集,并可以当做表来使用.它的作用就是方便查询操作,减 ...
- java集合类List
1.List Vector:线程安全的. ArrayList:适合查找与顺序添加. LinkedList:适合随机插入与删除. 1.1ArrayList与LinkedList的add添加 1.1.1A ...
- 【NOIP2017D2T3】列队
Description Sylvia 是一个热爱学习的女孩子. 前段时间,Sylvia 参加了学校的军训.众所周知,军训的时候需要站方阵.Sylvia所在的方阵中有n × m名学生,方阵的行数为 n, ...
- php 对象数组互转
数组转对象 function array2object($array) { if (is_array($array)) { $obj = new StdClass(); forea ...
- leetcode 199. Binary Tree Right Side View 、leetcode 116. Populating Next Right Pointers in Each Node 、117. Populating Next Right Pointers in Each Node II
leetcode 199. Binary Tree Right Side View 这个题实际上就是把每一行最右侧的树打印出来,所以实际上还是一个层次遍历. 依旧利用之前层次遍历的代码,每次大的循环存 ...
- ros自定义消息的时候报错ImportError: No module named em
Traceback (most recent call last): File "/opt/ros/kinetic/share/gencpp/cmake/../../../lib/genc ...