SpringBoot 參數驗證之 -Validated 和 -Vali
0x01:Spring Validation 驗證框架
Spring Validation 驗證框架對參數的驗證機制提供了 @Validated (Spring's JSR-303 規範,是標準 JSR-303 的一個變種),javax 提供了 @Valid(標準 JSR-303 規範),配合 BindingResult 可以直接提供參數驗證結果。其中對於字段的特定驗證註解,比如 @NotNull。
兩者在檢驗 Controller 的入參是否符合規範時,使用 @Validated 或者 @Valid 在基本驗證功能上沒有太多區別。但是在分組、註解地方、嵌套驗證等功能上兩個有所不同:
@Validated
-
分組:提供分組功能,可在入參驗證時,根據不同的分組採用不同的驗證機制。
-
可註解位置 :可以用在類型、方法和方法參數上。但是不能用在成員屬性上
-
嵌套驗證:用在方法入參上無法單獨提供嵌套驗證功能;不能用在成員屬性上;也無法提供框架進行嵌套驗證;能配合嵌套驗證註解 @Valid 進行嵌套驗證。
@Valid
-
分組:無分組功能
-
可註解位置:可以用在方法、構造函數、方法參數和成員屬性上(兩者是否能用於成員屬性上直接影響能否提供嵌套驗證的功能)
-
嵌套驗證:用在方法入參上無法單獨提供嵌套驗證功能;能夠用在成員屬性上,提示驗證框架進行嵌套驗證;能配合嵌套驗證註解 @Valid 進行嵌套驗證。
0x02:簡單集成
- 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>
- 創建 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;
}
}
主要在參數中添加 @Validated 註解,然後使用的 JSON 格式數據提交
- 創建參數 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,標識不能爲空
- 創建啓動引導類
@SpringBootApplication
public class Application
{
public static void main( String[] args )
{
SpringApplication.run(Application.class, args);
}
}
- 測試驗證
請求參數
如果爲空,則驗證不過;如果不爲空,則驗證通過
0x03:分組驗證
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;
}
關鍵代碼
-
@Validated(value={UserDto.Add.class})
-
@Validated(value={UserDto.Update.class})
進行了分組校驗
- UserDto 對象代碼
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
}
- 測試驗證
添加用戶
更新用戶
如有 id 參數
中獎名單
本文由 Readfog 進行 AMP 轉碼,版權歸原作者所有。
來源:https://mp.weixin.qq.com/s/yAovWmsFB7AWIbR8DzNtfA