繁体   English   中英

使用Spring Reactive时如何验证Mono

[英]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) {

    ...
}

然后,我们将在ControllerAdviceErrorController处理异常,并将适当的4xx响应传递给客户端。

但是,当我将参数更改为Mono ,如下所示,它似乎不再起作用。

@Validated
@Service
public class FooService

@Validated(SignUpValidation.class)
public Mono<Void> signup(@Valid Mono<UserCommand> userCommand) {

    ...
}

据我了解,Spring Reactive可能实际上不起作用。 那么,Spring 5最佳实践将是什么来验证MonoFlux ,然后发送适当的错误响应?

很快,在回答这个问题之前,您的方法的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.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM