根据当前的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));
}
我们是否应该手动执行此操作,或者有一些自动方法可以执行此操作?
答案 0 :(得分:13)
在Spring 5.0版中,没有自动方法在功能端点中进行验证,因此必须手动完成验证。
虽然目前没有具体的计划,但我们可能会在未来添加某种验证。但即使这样,它也将是一个显式的方法调用,而不是一个自动机制。总的来说,功能端点模型的设计比基于注释的模型要明确得多。
答案 1 :(得分:1)
正如 arjen-poutsma 所说,似乎没有办法在Spring 5功能端点上运行自动验证。
Spring文档对此并不十分清楚,也没有建议任何方法。
在this Baeldung article上,您会发现有关如何使用此方法运行验证的想法(免责声明:我是本文的作者:))
简而言之,您可以按照以下步骤操作:
编辑:
我一直在关注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巫婆是创建此异常的依赖项。