gpt4 book ai didi

spring - 在 Spring Webflux 功能应用程序中验证请求的最佳方法是什么

转载 作者:行者123 更新时间:2023-12-04 15:18:15 25 4
gpt4 key购买 nike

在传统的 Web 应用程序中,很容易在 Controller 方法中验证请求主体,例如。

ResponseEntity create(@Valid @ResponseBody Post post) {
}

如果是 MVC 应用程序,我们可以通过注入(inject) BindingResult 来收集错误。 ,并确定输入表单中是否存在一些验证错误。

在页面中,有一些帮助 Freemarker 和 Thymeleaf 来显示消息。

但是当我来到 Webflux 并尝试使用 RouterFunction在应用程序中定义路由。例如,
Mono<ServerResponse> create(ServerRequest req) {
return req.bodyToMono(Post.class)
.flatMap { this.posts.save(it) }
.flatMap { ServerResponse.created(URI.create("/posts/".concat(it.getId()))).build() }
}

@Bean
RouterFunction<ServerResponse> routes(PostHandler postController) {
return route(GET("/posts"), postController.&all)
.andRoute(POST("/posts"), postController.&create)
.andRoute(GET("/posts/{id}"), postController.&get)
.andRoute(PUT("/posts/{id}"), postController.&update)
.andRoute(DELETE("/posts/{id}"), postController.&delete)
}

一种可能的方法是将请求数据( MonoFlux )转换为阻塞并注入(inject) Validator并手动验证它们。

但我认为代码看起来有点难看。

如何处理请求正文或表单数据的验证 优雅 ?

是否有更好的方法来验证请求正文或表单数据,并且不会丢失 WEB(呈现 View )和 REST 应用程序的功能和 react 特性?

最佳答案

我已经为这个 porpose 开发了“Yet Another Validator”。

https://github.com/making/yavi

如果 YAVI 能满足你的期望,那就太好了。

验证代码如下所示:

static RouterFunction<ServerResponse> routes() {
return route(POST("/"), req -> req.bodyToMono(User.class) //
.flatMap(body -> validator.validateToEither(body) //
.leftMap(violations -> {
Map<String, Object> error = new LinkedHashMap<>();
error.put("message", "Invalid request body");
error.put("details", violations.details());
return error;
})
.fold(error -> badRequest().syncBody(error), //
user -> ok().syncBody(user))));
}

关于spring - 在 Spring Webflux 功能应用程序中验证请求的最佳方法是什么,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/48031647/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com