@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
。有关更多详细信息,请参阅 验证 部分。