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