@RequestBody
@RequestBody
你可以使用@RequestBody注解来让请求体被读取并反序列化为一个Object,通过HttpMessageReader实现。以下示例使用了@RequestBody参数:
- Java
- Kotlin
@PostMapping("/accounts")
public void handle(@RequestBody Account account) {
// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody account: Account) {
// ...
}
与Spring MVC不同,在WebFlux中,@RequestBody方法参数支持响应式类型(reactive types),并且支持完全非阻塞的读取以及(客户端到服务器的)流式传输(streaming)。
- Java
- Kotlin
@PostMapping("/accounts")
public void handle(@RequestBody Mono<Account> account) {
// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody accounts: Flow<Account>) {
// ...
}
你可以使用WebFlux Config中的HTTP message codecs选项来配置或自定义消息读取器。
你可以将 @RequestBody 与 jakarta.validationValid 或 Spring 的 @Validated 注解结合使用,这样就会应用标准的 Bean Validation(Bean 验证)规则。验证失败会引发 WebExchangeBindException 异常,导致返回 400(BAD_REQUEST)错误响应。该异常中包含一个包含错误详情的 BindingResult 对象,你可以在控制器方法中通过为参数声明一个异步封装器(async wrapper),然后使用与错误相关的操作符来处理这些错误:
- 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异常。有关更多详细信息,请参阅验证部分。