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

How to Inject custom method argument in Spring WebFlux using HandlerMethodArgumentResolver?

我想使用 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

请注意,以上配置是添加到 Spring 使用 @EnableWebFlux 启用的 WebFlux Boot 项目中的 jar 的一部分。

看来您在这里混淆了两个不同的问题。

首先,您应该确保您的方法参数解析器在常规项目中工作。

为此,您需要一个 @Configuration class 来实现 WebFluxConfigurer 中的相关方法。您的代码片段可以做到这一点,但有两个缺陷:

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

    configurer.addCustomResolver(contextArgumentResolver());
    

现在这个问题的第二部分是关于将其设置为 Spring 启动自动配置。我猜您希望 WebFlux 应用程序在依赖于您的库时自动获取该自定义参数解析器。

如果你想做到这一点,你应该首先确保read up a bit about auto-configurations in the reference documentation。之后,您会意识到您的配置 class 并不是真正的自动配置,因为它会在所有情况下应用。

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

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