Java类属性字段校验(validation的使⽤)
Java类属性字段校验(validation的使⽤)
1、需求来源:⽇常校验需求
⽇常开发中,我们时常需要提供可靠的 API 接⼝,此时对于请求的⼊参就需要校验,以保证最终数据⼊库的正确性,这就成了必不可少的活。例如说,⽤户注册时,会校验⼿机格式的正确性、邮箱格式的正确性、密码⾮弱密码等。
但是如果使⽤ if-else 这种代码去校验, 那么需要校验的地⽅有很多情况下,代码量就会变的⼗分臃肿,若是⼀个类请求参数校验字段⼜多的化,相信各位⼩伙伴对不会开⼼,这么⼲肯定不合适,代码也不优雅,那么如何解决这个问题呢?
答案就是下⾯要介绍的 validation
2、validation介绍
validation 技术在Java中运⽤最早在2009 年,Java 官⽅提出了 Bean Validation 规范,⽽后经历了JSR303、JSR349、JSR380 三次标准的更迭,发展到了 2.0 。
Bean Validation 和 我们以前学习过的 JPA ⼀样,只提供规范,不提供具体的实现。因此实际使⽤过程,常⽤的是 hibernate 的校验组件:org.hibernate.hibernate-validator
2-1、常见的注解
1. 通常情况下,在straints 包下,定义了⼀系列的约束(constraint)注解,⼀共 22 个注解,快速略过即可。如
下:
1. 空和⾮空检查
1. @NotBlank:只能⽤于字符串不为 null ,并且字符串 .trim() 以后 length 要⼤于 0 。
2. @NotEmpty:集合对象的元素不为 0 ,即集合不为空 。
3. @NotNull:不能为 null 。
4. @Null:必须为 null 。
2. 数值检查
1. @DecimalMax(value):被注释的元素必须是⼀个数字,其值必须⼩于等于指定的最⼤值。
2. @DecimalMin(value):被注释的元素必须是⼀个数字,其值必须⼤于等于指定的最⼩值。
3. @Digits(integer, fraction):被注释的元素必须是⼀个数字,其值必须在可接受的范围内。
4. @Positive:判断正数。
5. @PositiveOrZero:判断正数或 0 。
6. @Max(value):该字段的值只能⼩于或等于该值。
7. @Min(value):该字段的值只能⼤于或等于该值。
8. @Negative:判断负数。
9. @NegativeOrZero:判断负数或 0 。
3. Boolean 值检查
1. @AssertFalse:被注释的元素必须为 true 。
2. @AssertTrue:被注释的元素必须为 false 。
4. 长度检查
1. @Size(max, min):检查字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等。
1. @Size(max, min):检查字段的 size 是否在 min 和 max 之间,可以是字符串、数组、集合、Map 等。
5. ⽇期检查
1. @Future:被注释的元素必须是⼀个将来的⽇期。
2. @FutureOrPresent:判断⽇期是否是将来或现在⽇期。
3. @Past:检查该字段的⽇期是在过去。
4. @PastOrPresent:判断⽇期是否是过去或现在⽇期。
6. 其它检查
1. @Email:被注释的元素必须是电⼦邮箱地址。
2. @Pattern(value):被注释的元素必须符合指定的正则表达式。
2. Hibernate Validator 附加的约束注解,在org.straints 包下,定义了⼀系列的约束(constraint)注解。
常见的如⽰。
1. @Range(min=, max=):被注释的元素必须在合适的范围内。
2. @Length(min=, max=):被注释的字符串的⼤⼩必须在指定的范围内。
3. @URL(protocol=,host=,port=,regexp=,flags=):被注释的字符串必须是⼀个有效的 URL 。
4. @SafeHtml:判断提交的 HTML 是否安全。例如说,不能包含 javascript 脚本等等。
其他的就不⼀⼀列举了,有感兴趣的⼩伙伴可以去源码包看看。
3. @Valid和 @Validated
1. @Valid 注解,是 Bean Validation 所定义,可以添加在普通⽅法、构造⽅法、⽅法参数、⽅法返回、成员变量上,表⽰它们需
要进⾏约束校验。
2. @Validated 注解,是 Spring Validation 锁定义,可以添加在类、⽅法参数、普通⽅法上,表⽰它们需要进⾏约束校验。同
时,@Validated 有 value 属性,⽀持分组校验。
对于初学者来说,很容易搞混 @Valid 和 @Validated 注解。
① 声明式校验:Spring Validation 仅对 @Validated 注解,实现声明式校验。
② 分组校验:Bean Validation 提供的 @Valid注解,因为没有分组校验的属性,所以⽆法提供分组校验。此时,我们只能使⽤ @Validated 注解。
③ 嵌套校验:相⽐来说,@Valid注解的地⽅,多了【成员变量】。这就导致,如果有嵌套对象的时候,只能使⽤@Valid注解。
2-2、快速⼊门
在 l ⽂件中,引⼊相关依赖。
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="/POM/4.0.0"
xsi="/2001/XMLSchema-instance"
schemaLocation="/POM/4.0.0 /xsd/maven-4.0.0.xsd">
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.2.1.RELEASE</version>
<relativePath/><!-- lookup parent from repository -->
</parent>
<modelVersion>4.0.0</modelVersion>
<groupId>com.raos</groupId>
<artifactId>validation-demo</artifactId>
<version>1.0-SNAPSHOT</version>
<dependencies>
<!-- 实现对 Spring MVC 的⾃动化配置 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
<!-- lombok依赖(代码简洁处理) -->
<dependency>
<groupId>org.projectlombok</groupId>
<artifactId>lombok</artifactId>
<scope>compile</scope>
</dependency>
<!-- 单元测试依赖 -->
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-test</artifactId>
<scope>test</scope>
</dependency>
</dependencies>
</project>
spring-boot-starter-web 依赖⾥,已经默认引⼊ hibernate-validator 依赖,所以本⽰例使⽤的是 Hibernate Validator 作为 Bean Validation 的实现框架。
1、简单校验
编写实体类(这⾥以常⽤的⽤户注册为场景)
@Data
public class SysUser {
private Long userId;
/**
* 账号
*/
@NotBlank(message ="⽤户名不能为空")
@Size(min =6, message ="⽤户名长度不能⼩于6个字符") private String username;
/**
* 密码
*/
@NotEmpty(message ="密码不能为空")
@Size(min =8, message ="密码长度不能⼩于8个字符") private String password;
/**
* ⼿机号
*/
@NotBlank(message ="⼿机号不能为空")
@Size(min =11, max =11, message ="⼿机号长度不对") private String mobile;
}
编写前端控制器
@RestController
@RequestMapping("/user")
public class SysUserController {
@PostMapping("/add")
public R addUser(@RequestBody@Valid SysUser sysUser){ System.out.println("⾛到这⾥说明校验成功");
System.out.println(sysUser);
return R.ok(R.SUCCESS_MSG);
}
}
编写前端响应封装实体
public class R extends HashMap<String, Object>{ private static final long serialVersionUID =1L;
public static final String SUCCESS_MSG ="操作成功!"; public static final String FAIL_MSG ="操作失败!"; public R(){
this.put((String)"code",0);
}
public static R error(){
return error(500,"未知异常,请联系管理员");
}
public static R error(String msg){
return error(500, msg);
}
public static R error(int code, String msg){
R r =new R();
r.put((String)"code", code);
r.put((String)"msg", msg);
return r;
}
public static R ok(String msg){
R r =new R();
r.put((String)"msg", msg);
return r;
}
public static R ok(Object object){
R r =new R();
r.put("result", object);
return r;
}
public static R ok(int code, String msg){
R r =new R();
r.put((String)"code", code);
r.put((String)"msg", msg);
return r;
}
public static R ok(Map<String, Object> map){
R r =new R();
r.putAll(map);
return r;
}
public static R ok(){
validation框架return new R();
}
public R put(String key, Object value){
super.put(key, value);
return this;
}
}
编写⾃定义异常(⽤于后续业务抛出异常错误)
版权声明:本站内容均来自互联网,仅供演示用,请勿用于商业和其他非法用途。如果侵犯了您的权益请与我们联系QQ:729038198,我们将在24小时内删除。
发表评论