如何使用HandlerMethodArgumentResolver在Spring WebFlux中注入自定义方法参数?

时间:2018-12-28 08:11:36

标签: spring spring-boot spring-webflux spring-config

我想使用Spring WebFlux创建一个自定义方法参数解析器。我正在关注link,但它似乎无法正常工作。

我能够使用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())
}

请注意,我使用的是 .web.reactive。包中的HandlerMethodArgumentResolver。

我的自动配置文件如下

@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的一部分,该jar已添加到使用@EnableWebFlux启用的Spring WebFlux Boot项目中。

1 个答案:

答案 0 :(得分:0)

似乎您在这里混淆了两个不同的问题。

首先,您应该确保方法参数解析器可以在常规项目中使用。

为此,您需要一个@Configuration类来实现WebFluxConfigurer中的相关方法。您的代码段正在执行此操作,但是存在两个缺陷:

  • 您的配置使用的是is disabling the WebFlux auto-configuration in Spring Boot@EnableWebFlux。您应该删除该
  • 似乎您正在尝试将MethodArgumentResolver的列表强制转换为单个实例,这可能就是为什么此处无法正常运行的原因。我相信您的代码段可能只是:

    configurer.addCustomResolver(contextArgumentResolver());
    

现在,这个问题的第二部分是关于将其设置为Spring Boot自动配置。我猜想您希望WebFlux应用程序自动获取自定义参数解析器(如果它们依赖于您的库)。

如果要实现这一点,则应首先确保read up a bit about auto-configurations in the reference documentation。之后,您将意识到您的配置类并不是真正的自动配置,因为它将在所有情况下都适用。

您可能应该在该配置上添加一些条件,例如:

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