Spring 5 Webflux功能端点 - 如何执行输入验证?

时间:2017-10-01 02:09:03

标签: spring spring-mvc hibernate-validator spring-webflux

根据当前的doc(5.0.0.RELEASE),Spring Webflux在使用带注释的控制器时支持验证:

  

默认情况下,如果类路径上存在Bean验证 - 例如   Hibernate Validator,LocalValidatorFactoryBean注册为   全局Validator用于@Valid并在@Controller上验证   方法论证。

然而,没有说明如何使用功能端点自动化它。实际上,文档中唯一的输入处理示例并未验证任何内容:

public Mono<ServerResponse> createPerson(ServerRequest request) { 
    Mono<Person> person = request.bodyToMono(Person.class);
    return ServerResponse.ok().build(repository.savePerson(person));
}

我们是否应该手动执行此操作,或者有一些自动方法可以执行此操作?

3 个答案:

答案 0 :(得分:13)

在Spring 5.0版中,没有自动方法在功能端点中进行验证,因此必须手动完成验证。

虽然目前没有具体的计划,但我们可能会在未来添加某种验证。但即使这样,它也将是一个显式的方法调用,而不是一个自动机制。总的来说,功能端点模型的设计比基于注释的模型要明确得多。

答案 1 :(得分:1)

正如 arjen-poutsma 所说,似乎没有办法在Spring 5功能端点上运行自动验证。

Spring文档对此并不十分清楚,也没有建议任何方法。

this Baeldung article上,您会发现有关如何使用此方法运行验证的想法(免责声明:我是本文的作者:))

简而言之,您可以按照以下步骤操作:

  1. 实施Spring验证程序来评估您的资源
  2. 使用处理程序在处理请求时将遵循的基本过程创建一个抽象类,而在子类中保留数据有效时的处理方式
  3. 让您的请求处理程序类扩展此抽象类,实现此抽象方法,说明其期望的主体,以及需要使用哪种验证器对其进行验证

编辑:

我一直在关注this related Spring issue,现在我们似乎可以参考有关此主题的官方文档了:https://github.com/spring-projects/spring-framework/blob/master/src/docs/asciidoc/web/webflux-functional.adoc#validation

建议的方法是使用本文所述的验证器。

答案 2 :(得分:0)

在当前版本(2.0.4.RELEASE)中,尚无一种使用句柄进行自动验证的方法,但是您总是可以像这样进行手动验证:

@Slf4j
@Component
@FieldDefaults(makeFinal = true, level = AccessLevel.PRIVATE)
@RequiredArgsConstructor
public class MyHandlerValidator implements HandlerValidator<MyResource> {

    Validator validator;

    @Override
    public void callValidator(final MyResource fdr) {
        final DataBinder binder = new DataBinder(fdr);
        binder.setValidator(validator);
        binder.validate();

        if (binder.getBindingResult().hasErrors()) {
            final String reason = binder.getBindingResult().getFieldError().toString();
            log.error(reason);
            throw new ResponseStatusException(HttpStatus.BAD_REQUEST, reason);
        }
    }   
}

与此相关的事情是,您应该像自动验证一样抛出WebExchangeBindException,但是我无法创建MethodParameter巫婆是创建此异常的依赖项。