SpringBoot 參數(shù)驗(yàn)證之 @Validated 和 @Valid
0x01:Spring Validation 驗(yàn)證框架
Spring Validation 驗(yàn)證框架對(duì)參數(shù)的驗(yàn)證機(jī)制提供了@Validated (Spring's JSR-303 規(guī)范,是標(biāo)準(zhǔn) JSR-303 的一個(gè)變種),javax 提供了@Valid(標(biāo)準(zhǔn) JSR-303 規(guī)范),配合 BindingResult 可以直接提供參數(shù)驗(yàn)證結(jié)果。其中對(duì)于字段的特定驗(yàn)證注解,比如 @NotNull。
兩者在檢驗(yàn) Controller 的入?yún)⑹欠穹弦?guī)范時(shí),使用@Validated 或者 @Valid 在基本驗(yàn)證功能上沒(méi)有太多區(qū)別。但是在分組、注解地方、嵌套驗(yàn)證等功能上兩個(gè)有所不同:
@Validated
分組:提供分組功能,可在入?yún)Ⅱ?yàn)證時(shí),根據(jù)不同的分組采用不同的驗(yàn)證機(jī)制。
可注解位置 :可以用在類型、方法和方法參數(shù)上。但是不能用在成員屬性上
嵌套驗(yàn)證:用在方法入?yún)⑸蠠o(wú)法單獨(dú)提供嵌套驗(yàn)證功能;不能用在成員屬性上;也無(wú)法提供框架進(jìn)行嵌套驗(yàn)證;能配合嵌套驗(yàn)證注解 @Valid 進(jìn)行嵌套驗(yàn)證。
@Valid
分組:無(wú)分組功能
可注解位置:可以用在方法、構(gòu)造函數(shù)、方法參數(shù)和成員屬性上(兩者是否能用于成員屬性上直接影響能否提供嵌套驗(yàn)證的功能)
嵌套驗(yàn)證:用在方法入?yún)⑸蠠o(wú)法單獨(dú)提供嵌套驗(yàn)證功能;能夠用在成員屬性上,提示驗(yàn)證框架進(jìn)行嵌套驗(yàn)證;能配合嵌套驗(yàn)證注解@Valid進(jìn)行嵌套驗(yàn)證。
0x02:簡(jiǎn)單集成
pom.xml 文件添加如下依賴
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/xsd/maven-4.0.0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>com.olive</groupId>
<artifactId>valid-demo</artifactId>
<version>0.0.1-SNAPSHOT</version>
<packaging>jar</packaging>
<parent>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-parent</artifactId>
<version>2.1.8.RELEASE</version>
<relativePath />
</parent>
<name>valid-demo</name>
<url>http://maven.apache.org</url>
<properties>
<project.build.sourceEncoding>UTF-8</project.build.sourceEncoding>
</properties>
<dependencies>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-validation</artifactId>
</dependency>
<dependency>
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-starter-web</artifactId>
</dependency>
</dependencies>
</project>
創(chuàng)建 Cotroller
@RestController
public class UserController {
@RequestMapping("/user/queryUser")
public Map queryUser(@RequestBody @Validated UserQueryVo queryVo){
Map result = new HashMap();
result.put("code", 200);
result.put("msg", "success");
return result;
}
}
主要在參數(shù)中添加 @Validated 注解,然后使用的 JSON 格式數(shù)據(jù)提交
創(chuàng)建參數(shù) Vo 類
BaseVo.java
public class BaseVo implements Serializable{
}
UserQueryVo.java
public class UserQueryVo extends BaseVo {
@NotEmpty(message="不能為空")
private String query;
public String getQuery() {
return query;
}
public void setQuery(String query) {
this.query = query;
}
}
主要在查詢條件字段添加注解 @NotEmpty,標(biāo)識(shí)不能為空
創(chuàng)建啟動(dòng)引導(dǎo)類
@SpringBootApplication
public class Application
{
public static void main( String[] args )
{
SpringApplication.run(Application.class, args);
}
}
測(cè)試驗(yàn)證
請(qǐng)求參數(shù)

如果為空,則驗(yàn)證不過(guò);如果不為空,則驗(yàn)證通過(guò)

0x03:分組驗(yàn)證
controller 增加添加用戶和修改用戶接口
@RequestMapping("/user/addUser")
public Map addUser(@RequestBody @Validated(value={UserDto.Add.class}) UserDto userDto){
Map result = new HashMap();
result.put("code", 200);
result.put("msg", "success");
return result;
}
@RequestMapping("/user/editUser")
public Map editUser(@RequestBody @Validated(value={UserDto.Update.class}) UserDto userDto){
Map result = new HashMap();
result.put("code", 200);
result.put("msg", "success");
return result;
}
關(guān)鍵代碼
@Validated(value={UserDto.Add.class})
@Validated(value={UserDto.Update.class})
進(jìn)行了分組校驗(yàn)
UserDto 對(duì)象代碼
package com.olive.vo;
import javax.validation.constraints.NotNull;
import javax.validation.constraints.Null;
public class UserDto extends BaseVo{
@NotNull(groups=Update.class, message="不能為空")
@Null(groups=Add.class)
private Integer id;
private String userName;
// 省略 getter setter
}
測(cè)試驗(yàn)證
添加用戶

更新用戶

如有id參數(shù)

中獎(jiǎng)名單


喜歡,在看
