@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>) {
// ...
}
你可以使用 WebFlux 配置的 HTTP 訊息編解碼器選項來配置或自定義訊息讀取器。
你可以將 @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。有關更多詳細資訊,請參閱 驗證 部分。