@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 配置 來配置或定製訊息讀取器。

您可以將 @RequestBodyjakarta.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。更多詳情請參閱驗證一節。