@RequestBody
您可以使用@RequestBody
注解,通过HttpMessageReader将请求体读取并反序列化为一个Object
。以下示例使用了@RequestBody
参数:
-
Java
-
Kotlin
@PostMapping("/accounts")
public void handle(@RequestBody Account account) {
// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody account: Account) {
// ...
}
@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
。有关更多详细信息,请参阅
验证部分。