对于最新的稳定版本,请使用 Spring Framework 6.2.10spring-doc.cadn.net.cn

@RequestBody

您可以使用@RequestBody注释,让请求正文读取并反序列化为Object通过 HttpMessageReader。以下示例使用@RequestBody论点:spring-doc.cadn.net.cn

@PostMapping("/accounts")
public void handle(@RequestBody Account account) {
	// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody account: Account) {
	// ...
}

与 Spring MVC 不同,在 WebFlux 中,@RequestBodymethod 参数支持响应式类型以及完全非阻塞读取和(客户端到服务器)流式传输。spring-doc.cadn.net.cn

@PostMapping("/accounts")
public void handle(@RequestBody Mono<Account> account) {
	// ...
}
@PostMapping("/accounts")
fun handle(@RequestBody accounts: Flow<Account>) {
	// ...
}

您可以使用 WebFlux ConfigHTTP 消息编解码器选项来配置或自定义消息阅读器。spring-doc.cadn.net.cn

您可以使用@RequestBody结合使用jakarta.validation.Valid或 Spring 的@Validated注释,这会导致应用标准 Bean 验证。 验证 错误会导致WebExchangeBindException,这会导致 400 (BAD_REQUEST) 响应。异常包含一个BindingResult带有错误详细信息,并且可以在controller 方法中处理,方法是使用异步包装器声明参数,然后使用 error相关运算符:spring-doc.cadn.net.cn

@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,并将首先解决:spring-doc.cadn.net.cn

@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被引发。有关更多详细信息,请参阅验证部分spring-doc.cadn.net.cn