@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
。更多詳情請參閱驗證一節。