@RequestBody
您可以使用 @RequestBody
註解來讀取請求本文,並透過 HttpMessageReader 將其反序列化為 Object
。下列範例使用 @RequestBody
引數
-
Java
-
Kotlin
@PostMapping("/accounts")
public void handle(@RequestBody Account account) {
// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody account: Account) {
// ...
}
與 Spring MVC 不同,在 WebFlux 中,@RequestBody
方法引數支援反應式類型,以及完全非阻塞的讀取和(用戶端到伺服器)串流。
-
Java
-
Kotlin
@PostMapping("/accounts")
public void handle(@RequestBody Mono<Account> account) {
// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody accounts: Flow<Account>) {
// ...
}
您可以使用 HTTP 訊息編解碼器 選項的 WebFlux 配置 來配置或自訂訊息讀取器。
您可以將 @RequestBody
與 jakarta.validation.Valid
或 Spring 的 @Validated
註解結合使用,這會導致套用標準 Bean 驗證。驗證錯誤會導致 WebExchangeBindException
,進而產生 400 (BAD_REQUEST) 回應。例外狀況包含具有錯誤詳細資訊的 BindingResult
,並且可以在控制器方法中透過宣告具有非同步包裝函式的引數,然後使用錯誤相關運算子來處理
-
Java
-
Kotlin
@PostMapping("/accounts")
public void handle(@Valid @RequestBody Mono<Account> account) {
// use one of the onError* operators...
}
@PostMapping("/accounts")
fun handle(@Valid @RequestBody account: Mono<Account>) {
// ...
}
您也可以宣告 Errors
參數以存取驗證錯誤,但在這種情況下,請求本文不得為 Mono
,並且會先解析
-
Java
-
Kotlin
@PostMapping("/accounts")
public void handle(@Valid @RequestBody Account account, Errors errors) {
// use one of the onError* operators...
}
@PostMapping("/accounts")
fun handle(@Valid @RequestBody account: Mono<Account>) {
// ...
}
如果方法驗證適用,因為其他參數具有 @Constraint
註解,則會改為引發 HandlerMethodValidationException
。如需更多詳細資訊,請參閱關於驗證的章節。