Java-Bean Validation后端校验总结
Validation
Information resource:
SpringBoot Docs: 2.8.9. @ConfigurationProperties Validation
Spring Boot attempts to validate @ConfigurationProperties classes whenever they are annotated with Spring’s @Validated annotation. You can use JSR-303 javax.validation constraint annotations directly on your configuration class. To do so, ensure that a compliant JSR-303 implementation is on your classpath and then add constraint annotations to your fields, as shown in the following example:
每当使用 Spring 的 @Validated 注释时,Spring Boot 都会尝试验证 @ConfigurationProperties 类。 可以直接在配置类上使用 JSR-303 javax.validation 约束注释。 为此,请确保类路径上有一个兼容的 JSR-303 实现,然后向字段添加约束注释,如以下示例所示:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
// ... getters and setters
}
You can also trigger validation by annotating the @Bean method that creates the configuration properties with @Validated.
还可以通过注释使用@Validated 创建配置属性的@Bean 方法来触发验证。
To ensure that validation is always triggered for nested properties, even when no properties are found, the associated field must be annotated with @Valid. The following example builds on the preceding AcmeProperties example:
为确保始终为嵌套属性触发验证,即使未找到任何属性,也必须使用 @Valid 注释关联字段。 以下示例建立在前面的 AcmeProperties 示例之上:
@ConfigurationProperties(prefix="acme")
@Validated
public class AcmeProperties {
@NotNull
private InetAddress remoteAddress;
@Valid
private final Security security = new Security();
// ... getters and setters
public static class Security {
@NotEmpty
public String username;
// ... getters and setters
}
}
JSR-303 Validation
JSR-303 是Java EE的一个子规范,官方参考实现Hibernate Validator
JSR-303 是一个数据验证的规范,而Hibernate Validator则是实现了这一规范,可以使用注解的方式对Bean进行验证,它的内部已经定义好了一系列的限制注解,只需将需要的注解标注在需要验证的实体类的属性上或者是对应的get方法上即可
JSR-303常用校验规则
布尔检查
| 注解 | 描述 |
|---|---|
| @AssertFalse | 被标注的对象是否为False |
| @AssertTrue | 被标注的对象是否为True |
空值检查
| 注解 | 描述 |
|---|---|
| @Null | 验证被标注的对象是否为NULL |
| @NotNull | 验证被标注的对象是否不为NULL |
| @NotBlank | 验证字符串是否非空,trim()后不为"",长度大于0 |
| @NotEmpty | 验证被标注对象是否为非空 |
长度检查
| 注解 | 描述 |
|---|---|
| @Length(min,max) | 验证字符串长度是否在min,max范围内 |
| @Size(min,max) | 验证对象(Collection,String,Map,Array)是否在规定范围内 |
日期检查
| 注解 | 描述 |
|---|---|
| @Past | 验证时间对象的值是否在当前时间之前 |
| @Future | 验证时间对象的值是否在当前时间之后 |
| @Pattern(regexp) | 验证字符串是否符合指定的正则表达式 |
数值检查
| 注解 | 描述 |
|---|---|
| 验证被标注对象是否为邮箱格式,NULL值不验证 | |
| @Valid | 关联对象是数组或集合时,对其元素进行校验 |
| @Digits(integer,fraction) | 验证字符串是否是符合指定格式的数字,integer整数精度,fraction小数精度 |
| @Min | 验证字符串是否是大于Min指定的最小值的数字 |
| @Max | 验证字符串是否是小于Max指定的最大值的数字 |
| @Range(min,max) | 验证元素是否在min,max范围内 |
使用Hibernate Validator的Demo
Demo的项目结构:

pom.xml
<!-- 使用的是hibernate validator -->
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>${hibernate-validator.version}</version>
</dependency>
User(Bean)
/**
* @Email 约束输入邮件的格式
* @NotBlank 指字符串使用trim()去掉前后空格后,不能够为空
*/
@ToString
@AllArgsConstructor
@NoArgsConstructor
@Data
public class User implements Serializable {
@NotBlank(message = "邮箱不能为空")
@Email(message = "邮箱非法")
private String userEmail;
@NotBlank(message = "电话不能为空")
@Pattern(regexp = "^((13[0-9])|(14[5,7])|(15[0-3,5-9])|(17[0,3,5-8])|(18[0-9])|166|198|199|(147))\\d{8}$",message = "手机号非法")
private String userPhone;
}
UserController
/**
* 以POST请求为例
* @Validated 注释类
* @RequestBody 可传Javabean类型
* @RequestParam 传单个参数
* @Valid 修饰在Javabean类型前
*/
@RestController
@Validated
public class UserController {
@RequestMapping(value = "/test",method = RequestMethod.POST)
public boolean test(@RequestBody @Valid User user){
return true;
}
@RequestMapping(value = "/hello",method = RequestMethod.GET)
public String hello(){
return "hello,world";
}
}
Rusult:Postman发个请求瞅瞅结果
- 输入正确格式的邮箱和手机

- 输入非法格式的邮箱


- 输入非法格式的手机号码


Java-Bean Validation后端校验总结的更多相关文章
- 深入了解数据校验:Java Bean Validation 2.0(JSR380)
每篇一句 吾皇一日不退役,尔等都是臣子 相关阅读 [小家Java]深入了解数据校验(Bean Validation):基础类打点(ValidationProvider.ConstraintDescri ...
- 1. 不吹不擂,第一篇就能提升你对Bean Validation数据校验的认知
乔丹是我听过的篮球之神,科比是我亲眼见过的篮球之神.本文已被 https://www.yourbatman.cn 收录,里面一并有Spring技术栈.MyBatis.JVM.中间件等小而美的专栏供以免 ...
- Java bean validation 规范与参考实现
1.Apache Bval 依赖包:validation-api-1.1.0.Final.jar org.apache.bval.bundle-1.1.1.jar bval-core-1.1.1.ja ...
- Java Bean Validation(参数校验) 最佳实践
转载来自:http://www.cnblogs.com 参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的 ...
- Java Bean Validation 最佳实践
参数校验是我们程序开发中必不可少的过程.用户在前端页面上填写表单时,前端js程序会校验参数的合法性,当数据到了后端,为了防止恶意操作,保持程序的健壮性,后端同样需要对数据进行校验.后端参数校验最简单的 ...
- java bean validation 参数验证
一.前言 二.几种解决方案 三.使用bean validation 自带的注解验证 四.自定义bean validation 注解验证 一.前言 在后台开发过程中,对参数的校验成为开发环境不可缺少的一 ...
- Spring validation 后端校验【转】
本文来自 下一秒升华 的CSDN 博客 ,全文地址请点击:https://blog.csdn.net/u013815546/article/details/77248003?utm_source=co ...
- SpringBoot - Bean validation 参数校验
目录 前言 常见注解 参数校验的应用 依赖 简单的参数校验示例 级联校验 @Validated 与 @Valid 自定义校验注解 前言 后台开发中对参数的校验是不可缺少的一个环节,为了解决如何优雅的对 ...
- Java Bean validation specification...
http://www.ibm.com/developerworks/cn/java/j-lo-beanvalid/index.html
随机推荐
- python aes pkcs7加密
# -*- coding: UTF-8 -*- from Crypto.Util.Padding import pad from Crypto.Cipher import AES import bas ...
- python ui自动化之多窗口切换
wd.current_window_handle #获取当前窗口句柄 wd.window_handles #获取所有窗口句柄 wd.switch_to.window(wd.window_handles ...
- Python爬虫学习——1.爬虫入门
HTTP和HTTPS HTTP协议(HyperText Transfer Protocol,超文本传输协议):是一种发布和接收 HTML页面的方法. HTTPS(Hypertext Transfer ...
- 痞子衡嵌入式:在IAR开发环境下将关键函数重定向到RAM中执行的三种方法
大家好,我是痞子衡,是正经搞技术的痞子.今天痞子衡给大家分享的是在IAR开发环境下将关键函数重定向到RAM中执行的三种方法. 嵌入式项目里应用程序代码正常是放在 Flash 中执行的,但有时候也需要将 ...
- Linux提权手法整理
之前写过了windows提权小结,这下一篇水什么就有了嘛,于是有了这篇水文,整理一下Linux提权 前篇windows提权小结 ,链接送上 https://www.cnblogs.com/lcxblo ...
- C#调用C++ dll中返回值为字符串的函数问题
C#调用C++ dll函数,如果返回值为字符串,我们使用string去接收就会报错,因为C++返回的是char*,是个指针,所以c# 要用 IntPtr 来接收. C++: //预编译的标头 .h e ...
- ASP net core面试题汇总及答案
在dot net core中,我们不需要关心如何释放这些服务, 因为系统会帮我们释放掉.有三种服务的生命周期. 单实例服务, 通过add singleton方法来添加.在注册时即创建服务, 在随后的请 ...
- CSS基本语法(慕课网学习笔记)
CSS的声明,内外联样式以及CSS的优先级 css学习.html <!DOCTYPE html> <html lang="en"> <head> ...
- 线程池ExecutorService的使用
转载自: 海子 Java并发编程:线程池的使用 在前面的文章中,我们使用线程的时候就去创建一个线程,这样实现起来非常简便,但是就会有一个问题: 如果并发的线程数量很多,并且每个线程都是执行一个时间很短 ...
- jQuery中获取属性值:attr()、html()、text()、val()等(一)
<!DOCTYPE html> <html> <head> <title>01_basic.html</title> <meta na ...