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