@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。如需更多詳細資訊,請參閱關於驗證的章節。