[英]How to validate Mono when using Spring Reactive
我们正在评估一个项目的Spring 5,并且不确定如何最好地验证Mono
参数。 传统上,我们一直使用MethodValidationPostProcessor来验证我们的方法参数,如下所示:
@Validated
@Service
public class FooService
@Validated(SignUpValidation.class)
public void signup(@Valid UserCommand userCommand) {
...
}
然后,我们将在ControllerAdvice
或ErrorController
处理异常,并将适当的4xx响应传递给客户端。
但是,当我将参数更改为Mono
,如下所示,它似乎不再起作用。
@Validated
@Service
public class FooService
@Validated(SignUpValidation.class)
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand) {
...
}
据我了解,Spring Reactive可能实际上不起作用。 那么,Spring 5最佳实践将是什么来验证Mono
和Flux
,然后发送适当的错误响应?
很快,在回答这个问题之前,您的方法的void
返回类型在反应式应用程序中非常罕见。 看来,此方法应该异步执行实际工作,但该方法返回一个同步类型。 我已将其更改为我的答案中的Mono<Void>
。
如参考文档中所述 ,Spring WebFlux确实支持验证。
但此处的最佳做法有所不同,因为方法参数可以是反应性类型。 如果method参数尚未解析,则无法获得验证结果。
因此,类似的事情实际上是行不通的:
// can't have the BindingResult synchronously,
// as the userCommand hasn't been resolved yet
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand, BindingResult result)
// while technically feasible, you'd have to resolve
// the userCommand first and then look at the validation result
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand, Mono<BindingResult> result)
反应式运算符更惯用且更易于使用:
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand) {
/*
* a WebExchangeBindException will flow through the pipeline
* in case of validation error.
* you can use onErrorResume or other onError* operators
* to map the given exception to a custom one
*/
return userCommand.onErrorResume(t -> Mono.error(...)).then();
}
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.