使用Spring Reactive时如何验证Mono
我们正在为一个项目评估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
s和Flux
es,然后发送适当的错误响应的最佳实践是什么?
回答:
很快,在回答该问题之前,方法的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();
}
以上是 使用Spring Reactive时如何验证Mono 的全部内容, 来源链接: utcz.com/qa/428562.html