在传统的 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(使用前将#替换为@)