Контроллер отдыха Spring 5 Webflux — как выполнить проверку ввода?

Я создаю веб-приложение с некоторым Rest Controller как:

@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

что происходит ?


person Seb    schedule 19.07.2018    source источник
comment
взгляните на stackoverflow.com/questions/47244769/   -  person Jorj    schedule 19.07.2018
comment
SpringBoot автоматически настраивает и запускает реактивную среду выполнения при обнаружении. Добавление @EnableWebFlux отключает часть этого.   -  person M. Deinum    schedule 19.07.2018
comment
@Jorj спасибо, но это не совсем мой вариант использования, в вашей проблеме они пытаются проверить реактивный объект, что невозможно, потому что вам нужно подождать, чтобы получить весь объект, прежде чем выполнять какую-либо проверку   -  person Seb    schedule 20.07.2018
comment
@M.Deinum M.Deinum верно, поэтому мне нужно определить собственный WebFluxConfigurer, верно? кажется, я могу переопределить getValidator(). вопрос в том, как получить валидатор по умолчанию, доступный в пути к классам?   -  person Seb    schedule 20.07.2018
comment
Зачем вам это нужно? Вы утверждаете, что все работает, если вы удалите аннотацию @EnableWebFlux...   -  person M. Deinum    schedule 20.07.2018
comment
Я использую тимелеаф, и мне нужно переопределить обработчики ресурсов   -  person Seb    schedule 20.07.2018
comment
@Seb, пожалуйста, обратите внимание на этот ответ stackoverflow.com/questions/46508618/   -  person Serhii Povísenko    schedule 20.07.2018


Ответы (2)


Как указано в справочная документация Spring Boot, добавление @EnableWebFlux означает, что вы хотите получить полный контроль над конфигурацией WebFlux. В данном случае это включает веб-проверку.

Теперь есть несколько способов настроить обработку ресурсов в вашем приложении — вы можете использовать различные ключи конфигурации spring.resources.* или добавить свой собственный класс конфигурации, реализующий WebFluxConfigurer и переопределяющий метод addResourceHandlers.

person Brian Clozel    schedule 20.07.2018

Спасибо @М. 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);
    }
}
person Seb    schedule 20.07.2018
comment
на нем все еще есть аннотация @EnableWebFlux, и ваша настройка конфигурации отражает то, что Spring Boot уже делает для вас. Проблема должна быть где-то в другом. - person Brian Clozel; 20.07.2018
comment
правда, странно то, что когда я удаляю @EnableWebFlux, My WebFluxConfig, похоже, не используется:/ - person Seb; 20.07.2018
comment
Вы имеете в виду, что если вы поместите точку останова отладки в этом классе, он не будет выполняться? У вас есть spring-boot-starter-web в пути к классам? Может быть, Spring Boot настраивает ваше приложение как приложение Spring MVC? - person Brian Clozel; 20.07.2018