@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。更多详情请参阅验证一节。