Spring Boot中@Valid 與 @Validated 注解的詳解
- 引言
- @Valid注解
- 功能介紹
- 使用場景
- 代碼樣例
- @Validated注解
- 功能介紹
- 使用場景
- 代碼樣例
- @Valid與@Validated的區別
- 結論
引言
在Spring Boot應用中,參數校驗是確保數據完整性和一致性的重要手段。@Valid和@Validated注解是Spring Boot中用于參數校驗的兩個核心注解。本文將詳細介紹這兩個注解的用法、區別以及代碼樣例。
@Valid注解
功能介紹
@Valid是Java EE提供的標準注解,它是JSR 303規范的一部分,主要用于Hibernate Validation等場景。在Spring Boot中,@Valid注解用于觸發參數校驗,確保請求參數的合法性。
使用場景
@Valid注解可以用于方法參數、構造函數、方法參數和成員屬性上。它主要用于嵌套校驗,即對于對象中的屬性值(可能是另一個對象)進行校驗。
代碼樣例
import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;
import javax.validation.Valid;public class User {@NotBlank(message = "用戶名不能為空")private String username;@NotNull(message = "密碼不能為空")private String password;@Validprivate Address address;// Getter 和 Setter
}public class Address {@NotBlank(message = "國家不能為空")private String country;@NotBlank(message = "城市不能為空")private String city;// Getter 和 Setter
}import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;@RestController
public class UserController {@PostMapping("/addUser")public String addUser(@Valid @RequestBody User user, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "用戶添加成功";}
}
在上述代碼中,User
類中的address
屬性使用了@Valid
注解,表示對address
對象進行嵌套校驗。在UserController
中,addUser
方法使用了@Valid
注解對傳入的User
對象進行校驗,并使用BindingResult
捕獲校驗錯誤。
@Validated注解
功能介紹
@Validated是Spring框架特有的注解,屬于Spring的一部分,也是JSR 303的一個變種。它提供了一些@Valid所沒有的額外功能,比如分組驗證。@Validated注解可以用在類、方法和方法參數上,但不能用于成員屬性。
使用場景
@Validated注解主要用于支持分組驗證,可以更細致地控制驗證過程。此外,由于它是Spring專有的,因此可以更好地與Spring的其他功能(如Spring的依賴注入)集成。
代碼樣例
import javax.validation.constraints.Min;
import javax.validation.constraints.NotBlank;
import javax.validation.groups.Default;public interface ValidationGroups {interface Insert extends Default {}interface Update {}
}public class Project {@NotBlank(message = "ID不能為空", groups = ValidationGroups.Update.class)private String id;@NotBlankprivate String name;@Min(value = 1, message = "預算不能小于1", groups = ValidationGroups.Insert.class)private int budget;// Getter 和 Setter
}import org.springframework.validation.BindingResult;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RestController;
import org.springframework.validation.annotation.Validated;@RestController
public class ProjectController {@PostMapping("/insertProject")public String insertProject(@Validated(value = ValidationGroups.Insert.class) @RequestBody Project project, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "項目插入成功";}@PostMapping("/updateProject")public String updateProject(@Validated(value = ValidationGroups.Update.class) @RequestBody Project project, BindingResult bindingResult) {if (bindingResult.hasErrors()) {return "參數校驗失敗: " + bindingResult.getAllErrors().get(0).getDefaultMessage();}return "項目更新成功";}
}
在上述代碼中,我們定義了一個ValidationGroups
接口,用于分組驗證。Project
類中的id
屬性在Update
分組下必填,而budget
屬性在Insert
分組下必填且不能小于1。在ProjectController
中,insertProject
方法使用@Validated(value = ValidationGroups.Insert.class)
注解對傳入的Project
對象進行Insert
分組的校驗,而updateProject
方法則使用@Validated(value = ValidationGroups.Update.class)
注解進行Update
分組的校驗。
@Valid與@Validated的區別
- 嵌套校驗:@Valid支持嵌套校驗,而@Validated不支持。在需要嵌套校驗的場景下,應使用@Valid。
- 分組校驗:@Validated支持分組校驗,而@Valid不支持。在需要根據不同場景應用不同校驗規則的情況下,應使用@Validated。
- 使用范圍:@Valid可以用在方法、構造函數、方法參數和成員屬性上,而@Validated只能用在類、方法和方法參數上。
結論
@Valid和@Validated注解在Spring Boot的參數校驗中扮演著重要角色。掌握這兩個注解的用法和區別,可以幫助開發者更靈活地進行參數校驗,確保數據的完整性和一致性。