Как ввести аргумент пользовательского метода в Spring WebFlux, используя HandlerMethodArgumentResolver? - PullRequest
0 голосов
/ 28 декабря 2018

Я хочу создать собственный аргумент метода Resolver, используя Spring WebFlux.Я перехожу по ссылке , но, похоже, она не работает.

Я могу создать собственный преобразователь аргументов с помощью WebMvc.

import org.springframework.web.reactive.result.method.HandlerMethodArgumentResolver;

public class MyContextArgumentResolver implements HandlerMethodArgumentResolver {

@Override
    public boolean supportsParameter(MethodParameter parameter) {
        return MyCustomeObject.class.isAssignableFrom(parameter.getParameterType())

   }

@Override
    public Mono<Object> resolveArgument(MethodParameter parameter, BindingContext bindingContext,
            ServerWebExchange exchange) {

.....
return Mono.just(new MyCustomeObject())
}

Обратите внимание, что яиспользуя HandlerMethodArgumentResolver из пакета .web.reactive. .

Мой файл автоконфигурации выглядит как

@Configuration
@ConditionalOnClass(EnableWebFlux.class) // checks that WebFlux is on the class-path
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE)//checks that the app is a reactive web-app
public class RandomWebFluxConfig implements WebFluxConfigurer {

    @Override
    public void configureArgumentResolvers(ArgumentResolverConfigurer configurer) {
MyContextArgumentResolver[] myContextArgumentResolverArray = {contextArgumentResolver()};
        configurer.addCustomResolver(myContextArgumentResolverArray );
    }

    @Bean
    public MyContextArgumentResolver contextArgumentResolver() {
        return new MyContextArgumentResolver ();
    }

Мои источники spring.factories выглядят как

# Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
com.XXXX.XXX.XXX.RandomWebFluxConfig

Обратите внимание, что приведенная выше конфигурация является частью jar, который добавлен в загрузочный проект Spring WebFlux, включенный с помощью @EnableWebFlux.

1 Ответ

0 голосов
/ 28 декабря 2018

Похоже, вы объединяете две разные проблемы.

Во-первых, вы должны убедиться, что ваш преобразователь аргументов метода работает в обычном проекте.

Для этого вам понадобится @Configuration класс, который реализует соответствующий метод в WebFluxConfigurer.Ваш фрагмент кода делает это, но с двумя недостатками:

  • Ваша конфигурация использует @EnableWebFlux, что отключает автоматическую настройку WebFlux в Spring Boot .Вы должны удалить это
  • , кажется, вы пытаетесь привести список MethodArgumentResolver в один экземпляр, и, вероятно, поэтому здесь ничего не работает.Я полагаю, что ваш фрагмент кода может быть просто:

    configurer.addCustomResolver(contextArgumentResolver());
    

Теперь вторая часть этого вопроса посвящена настройке автоматической конфигурации Spring Boot.Я предполагаю, что вы хотели бы, чтобы приложения WebFlux автоматически получали эти пользовательские средства разрешения аргументов, если они зависят от вашей библиотеки.

Если вы хотите добиться этого, вы должны сначала прочитать немного оавтоконфигурации в справочной документации .После этого вы поймете, что ваш класс конфигурации на самом деле не является автоконфигурацией, поскольку он будет применяться во всех случаях.

Возможно, вам следует добавить несколько условий для этой конфигурации, например:

@ConditionalOnClass(EnableWebFlux.class) // checks that WebFlux is on the classpath
@ConditionalOnWebApplication(type = ConditionalOnWebApplication.Type.REACTIVE) // checks that the app is a reactive web app
...