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



我想使用SpringWebFlux创建一个自定义方法参数Resolver。我正在关注链接,但它似乎不起作用。

我能够使用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.reflect.包中的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的一部分,它是在使用@EnableWebFlux启用的Spring WebFlux Boot项目中添加的。

这里似乎将两个不同的问题混为一谈。

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

为此,您需要一个@Configuration类来实现WebFluxConfigurer中的相关方法。您的代码片段正在这样做,但有两个缺陷:

  • 您的配置使用@EnableWebFlux,这将禁用Spring Boot中的WebFlux自动配置。你应该删除它
  • 您似乎正试图将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

相关内容

  • 没有找到相关文章

最新更新