我想使用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项目中。
答案 0 :(得分:0)
似乎您在这里混淆了两个不同的问题。
首先,您应该确保方法参数解析器可以在常规项目中使用。
为此,您需要一个@Configuration
类来实现WebFluxConfigurer
中的相关方法。您的代码段正在执行此操作,但是存在两个缺陷:
@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