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

2023-11-25

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

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

如果是 MVC 应用程序,我们可以通过注入一个来收集错误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)
}

一种可能的方法是转换请求数据(Mono or Flux)来阻止和注入Validator并手动验证它们。

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

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

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


为此,我开发了“又一个验证器”。

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))));
}
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

在 Spring Webflux 功能应用程序中验证请求的最佳方法是什么 的相关文章