【问题标题】:Spring 5 Webflux rest controller - How to perform input validation?Spring 5 Webflux 休息控制器 - 如何执行输入验证?
【发布时间】:2018-12-27 15:35:00
【问题描述】:

我正在构建一个带有一些 Rest Controller 的 Web 应用程序:

@RestController
@RequestMapping(value = Path.ROOT)
public class TestController {

    @Autowired
    private AService service;

    @RequestMapping(method = RequestMethod.POST)
    public Flux<ItemResponse> doSomething(@RequestBody @Valid final ItemRequest request) {
        return service.pleaseDoSomething(request);
    }


}

我的输入对象是这样的:

public Class ItemRequest{
   @NotNull
   private String anInputValue
}

我的应用有注释@EnableWebFlux

问题是根本没有发生验证,当我删除以前的注释时,一切正常。

我正在使用 Spring boot 2.0.3 / tomcat dep

发生了什么事?

【问题讨论】:

  • SpringBoot 在检测到时会自动配置并启动响应式运行时。添加 @EnableWebFlux 会禁用部分功能。
  • @Jorj 谢谢,但这不完全是我的用例,在您的问题中,他们正在尝试验证一个反应性对象,这是不可能的,因为您必须等待获得整个对象才能进行任何验证
  • @M.Deinum true 所以我需要定义一个自定义 WebFluxConfigurer 对吗?似乎我可以覆盖 getValidator()。问题是如何获得类路径中可用的默认验证器?
  • 你为什么需要那个?您声明如果删除 @EnableWebFlux 注释一切正常...

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


【解决方案1】:

the Spring Boot reference documentation 中所述,添加@EnableWebFlux 表示您希望完全控制WebFlux 配置。在这种情况下,这包括网络验证。

现在有几种方法可以在您的应用程序中自定义资源处理 - 您可以使用各种 spring.resources.* 配置键,或者添加您自己的实现 WebFluxConfigurer 的配置类并覆盖 addResourceHandlers 方法。

【讨论】:

    【解决方案2】:

    谢谢@M。 Deinum 和@Brian Clozel 这是我需要同时拥有百里香叶和验证工作的自定义配置类

    @Configuration
    @EnableWebFlux
    public class WebFluxConfig implements WebFluxConfigurer {
    
        @Resource
        private ThymeleafReactiveViewResolver thymeleafReactiveViewResolver;
    
        @Autowired
        private Validator defaultValidator;
    
        @Override
        public Validator getValidator() {
            return defaultValidator;
        }
    
        @Override
        public void configureViewResolvers(final ViewResolverRegistry registry) {
            registry.viewResolver(thymeleafReactiveViewResolver);
        }
    
        @Override
        public void addResourceHandlers(final ResourceHandlerRegistry registry) {
            registry.addResourceHandler("/**")
                    .addResourceLocations("classpath:/static/")
                    .resourceChain(false);
        }
    }
    

    【讨论】:

    • 上面仍然有 @EnableWebFlux 注释 - 您的配置设置反映了 Spring Boot 已经为您做的事情。问题一定出在其他地方。
    • true,奇怪的是当我删除 @EnableWebFlux 我的 WebFluxConfig 似乎没有使用:/
    • 你的意思是如果你在那个类中放置一个调试断点,它就不会被执行?你在类路径上有spring-boot-starter-web 吗?也许 Spring Boot 正在将您的应用程序配置为 Spring MVC 应用程序?
    猜你喜欢
    • 1970-01-01
    • 2018-01-17
    • 2018-09-08
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-02-01
    • 1970-01-01
    • 2020-09-18
    相关资源
    最近更新 更多