@RequestBody
您可以使用@RequestBody注解来读取和反序列化请求体为一个3通过一个HttpMessageReader。
以下示例使用了一个@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配置来配置或自定义消息读取器。
您可以使用 @RequestBody 结合 jakarta.validation.Valid 或 Spring 的 @Validated 注解,这会导致 Standard Bean Validation 被应用。验证错误会引发 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。有关更多详细信息,请参阅关于 验证 的章节。