Spring Boot中@Valid和@Validated的區別,你明白了嗎?
在Spring Boot中,@Valid和@Validated是常用的注解,用于參數校驗和驗證。盡管它們都用于驗證參數,但在嵌套校驗方面,它們存在著一些關鍵的區別。本文將詳細介紹@Valid和@Validated之間的三個區別,并重點講述嵌套校驗的區別,包括相應的代碼和解析。
1. 校驗級別
@Valid是Java標準的Bean Validation API的一部分,它提供了一種在方法參數、字段和方法級別上進行校驗的方式。它支持JSR-303和JSR-349規范,并且可以與Spring的Validator接口一起使用。
@Validated是Spring框架提供的注解,它是對@Valid的擴展。它提供了更多的校驗級別,包括方法參數和方法返回值的校驗。
2. 校驗目標
@Valid主要用于驗證JavaBean對象的屬性。它可以用于驗證請求參數、表單對象或任何帶有驗證注解的JavaBean。
@Validated主要用于驗證方法參數和方法返回值。它可以用于驗證控制器的請求參數、服務方法的輸入參數和返回值。
3. 嵌套校驗
嵌套校驗是指對復合對象中的屬性進行校驗,即驗證對象中的對象。在嵌套校驗中,@Valid和@Validated也存在一些區別。
@Valid的嵌套校驗
使用@Valid進行嵌套校驗時,被校驗的對象的屬性上需要加上@Valid注解。這樣,在校驗時會遞歸地進行嵌套校驗。
下面是一個使用@Valid進行嵌套校驗的示例:
public class Address {
@NotBlank(message = "街道不能為空")
private String street;
// 其他屬性省略
}
public class User {
@NotBlank(message = "用戶名不能為空")
private String username;
@Valid
private Address address;
// 其他屬性省略
}
@PostMapping("/user")
public ResponseEntity<String> createUser(@RequestBody @Valid User user) {
// 處理創建用戶的邏輯
return ResponseEntity.ok("用戶創建成功");
}
在上面的示例中,當請求參數中的User對象被傳遞到createUser方法時,address屬性上的@Valid注解會觸發嵌套校驗,對User對象中的Address對象的屬性進行校驗。
@Validated的嵌套校驗
與@Valid不同,@Validated不支持嵌套校驗。如果在使用@Validated注解時出現嵌套校驗,需要使用@Valid注解替代。
下面是一個使用@Validated進行嵌套校驗的示例:
public class Address {
@NotBlank(message = "街道不能為空")
private String street;
// 其他屬性省略
}
public class User {
@NotBlank(message = "用戶名不能為空")
private String username;
@Valid
private Address address;
// 其他屬性省略
}
@Service
@Validated
public class UserService {
public void createUser(@Valid User user) {
// 處理創建用戶的邏輯
}
}
在上面的示例中,UserService類中的createUser方法使用了@Validated注解,但是由于@Validated不支持嵌套校驗,所以在User對象上仍然需要使用@Valid注解來觸發嵌套校驗。
總結
總的來說,@Valid和@Validated是Spring Boot中常用的參數校驗注解。它們之間的三個主要區別是:
- 校驗級別:@Valid支持JSR-303和JSR-349規范,適用于Bean Validation API;@Validated是Spring框架提供的擴展,支持更多的校驗級別。
- 校驗目標:@Valid主要用于驗證JavaBean對象的屬性;@Validated主要用于驗證方法參數和方法返回值。
- 嵌套校驗:@Valid支持嵌套校驗,可以遞歸地對復合對象中的屬性進行校驗;@Validated不支持嵌套校驗,需要使用@Valid注解來觸發嵌套校驗。
根據具體的需求,選擇合適的注解來進行參數校驗是非常重要的。通過了解@Valid和@Validated之間的區別,特別是在嵌套校驗方面的區別,您可以更好地掌握它們的使用方式,并在Spring Boot應用程序中提供更準確、可靠的參數校驗功能。