1. 簡介
本教程將介紹如何驗證 Spring MVC 中 HTTP 請求參數和路徑變量,以及如何使用 JSR 303 註解驗證字符串和數字參數。
我們將驗證 String 和 Number 參數,並使用 JSR 303 註解。
要探索其他類型的驗證,您可以參考我們關於 Java Bean Validation 和方法約束的教程,或者學習如何創建自定義驗證器。
2. 配置
要使用 Java 驗證 API,我們需要添加一個 JSR 303 實現,例如:hibernate-validator:
<dependency>
<groupId>org.hibernate.validator</groupId>
<artifactId>hibernate-validator</artifactId>
<version>8.0.1.Final</version>
</dependency>我們還需要在我們的控制器中啓用對請求參數和路徑變量的驗證,通過添加 @Validated 註解來實現。
@RestController
@RequestMapping("/")
@Validated
public class RequestAndPathVariableValidationController {
// ...
}需要注意的是,啓用參數驗證也需要一個 MethodValidationPostProcessor Bean。
如果我們在使用 Spring Boot 應用程序,則此 Bean 會自動配置,因為我們 classpath 上有 hibernate-validator 依賴。
否則,在標準 Spring 應用程序中,我們必須顯式添加此 Bean:
@EnableWebMvc
@Configuration
@ComponentScan("com.baeldung.spring")
public class ClientWebConfigJava implements WebMvcConfigurer {
@Bean
public MethodValidationPostProcessor methodValidationPostProcessor() {
return new MethodValidationPostProcessor();
}
// ...
}默認情況下,Spring 中路徑或請求驗證過程中出現的任何錯誤都將導致 HTTP 500 響應。在本教程中,我們將使用 ControllerAdvice 的自定義實現,以更易讀的方式處理此類錯誤,並返回 HTTP 400 狀態碼,用於處理任何無效請求。該解決方案的源代碼可在 GitHub 找到。
3. 驗證 RequestParam
以下是一個示例,其中我們將一個數字星期幾作為請求參數傳遞到控制器方法中:
@GetMapping("/name-for-day")
public String getNameOfDayByNumberRequestParam(@RequestParam Integer dayOfWeek) {
// ...
}我們的目標是確保 dayOfWeek 的值在 1 到 7 之間。為此,我們將使用 @Min 和 @Max 註解。
@GetMapping("/name-for-day")
public String getNameOfDayByNumberRequestParam(@RequestParam @Min(1) @Max(7) Integer dayOfWeek) {
// ...
}任何不符合這些條件的請求將返回 HTTP 狀態碼 400,並附帶默認錯誤消息。
如果調用 http://localhost:8080/name-for-day?dayOfWeek=24,例如,響應消息將是:
getNameOfDayByNumber.dayOfWeek: must be less than or equal to 7@Max(value = 1, message = “day number has to be less than or equal to 7”)4. 驗證 @PathVariable
與 @RequestParam 類似,我們也可以使用來自 jakarta.validation.constraints 包中的任何註解來驗證 @PathVariable。
考慮一個示例,其中我們驗證一個 String 參數是否為空且長度小於或等於 10:
@GetMapping("/valid-name/{name}")
public void validStringRequestParam(@PathVariable("name") @NotBlank @Size(max = 10) String username) {
// ...
}任何帶有參數的請求,如果該參數長度超過 10 個字符,例如,將會導致 HTTP 400 錯誤,並返回以下消息:
createUser.name:size must be between 0 and 10默認消息可以輕鬆地通過在<em>@Size</em>註解中設置<em>message</em>參數來覆蓋。
5. 結論
在本文中,我們學習瞭如何在 Spring 應用中驗證請求參數和路徑變量。