spring - 在 Spring Boot 中,我可以从第 3 方禁用 @RestController(即 @Import'ed)吗?
问题描述
关键是该@RestController
课程来自我无法触摸的第 3 方包。我想要该包中的所有其他类,但不是特定的@RestController
,因为我想用我自己的端点替换这些端点。
这个类似乎也是由另一个类@Import'ed,它也在我无法控制的第 3 方包中(参见下面的 Edit3)
它类似于这个问题/答案,但是在那个问题中,OP 可以访问@RestController 并且可以附加一个@ConditionalOnExpression,而我不能。
还有另一种方法可以在春季禁用 @RestController 吗?
我要禁用的特定 @RestController 类是GraphQLController。
编辑1
以下是我尝试排除它但失败的一些方法
@ConfigurationPropertiesScan("com.mycomp.package")
@SpringBootApplication(exclude = {graphql.kickstart.spring.webflux.GraphQLController.class})
public class Application {
public static void main(String[] args) {
SpringApplication.run(Application.class, args);
}
}
上述尝试抛出一个
java.lang.IllegalStateException:无法排除以下类,因为它们不是自动配置类:-graphql.kickstart.spring.webflux.GraphQLController
如下所示,我也尝试@ComponentScan.Filter
过ASSIGNABLE_TYPE
@ConfigurationPropertiesScan("com.mycomp.package")
@ComponentScan(excludeFilters={
@ComponentScan.Filter(type= FilterType.ASSIGNABLE_TYPE, value=graphql.kickstart.spring.webflux.GraphQLController.class)})
@SpringBootApplication
public class Application {
....
}
没有错误,但它仍在实例化 bean。
也试过@ComponentScan.Filter
了REGEX
@ConfigurationPropertiesScan("com.mycomp.package")
@ComponentScan(excludeFilters={
@ComponentScan.Filter(type= FilterType.REGEX, pattern = "graphql.kickstart.spring.webflux.GraphQLController")})
@SpringBootApplication
public class Application {
....
}
这似乎也不起作用
也试过@ComponentScan.Filter
了CUSTOM
@ConfigurationPropertiesScan("com.mycomp.package")
@ComponentScan(excludeFilters = @ComponentScan.Filter(type = FilterType.CUSTOM,
classes = GraphQLControllerBeanFilter.class))
@SpringBootApplication
public class Application {
....
}
public class GraphQLControllerBeanFilter implements TypeFilter {
@Override
public boolean match(MetadataReader metadataReader,
MetadataReaderFactory metadataReaderFactory) {
ClassMetadata classMetadata = metadataReader.getClassMetadata();
String fullyQualifiedName = classMetadata.getClassName();
return fullyQualifiedName.equals("graphql.kickstart.spring.webflux.GraphQLController");
}
}
自定义过滤器似乎从来没有看到GraphQLController
. 事实上,我打印了所有的fullyQualifiedName
it 扫描文件,并且只com.mycomp.package
显示了我包裹中的那些。3rd 方库中没有任何内容,即使它正在加载它们。
我想知道是否@ComponentScan.Filter
曾经看到过 3rd 方包,或者我是否有其他一些弹簧设置覆盖它。
我也尝试添加@Primary
到我的控制器
@Primary
@RestController
public class MyGraphQLController extends graphql.kickstart.spring.webflux.GraphQLController
但这会导致此错误
java.lang.IllegalStateException:不明确的映射。无法映射'graphql.kickstart.spring.webflux.GraphQLController'
编辑2
这是第 3 方库,其中包含我要排除的 @RestController
implementation "com.graphql-java-kickstart:graphql-kickstart-spring-boot-starter-webflux:11.0.0"
编辑3
看起来graphql.kickstart.spring.webflux.boot.GraphQLSpringWebfluxAutoConfiguration正在将GraphQLController
注释导入@Import
。
在这种情况下是否有禁用或替换它的方法?
解决方案
推荐阅读
- python - 打开多个文本文件
- sql - 如何在从数据库中获取结果时忽略不存在的值
- python - 结合输入和数学
- kubernetes - Openshift 4 ConfigMap 二进制文件挂载为目录
- javascript - getStaticProps 返回空对象
- sql - 使用 postgreSQL 中的触发器将数据从一个表移动到另一个表
- javascript - 单击“确定”后重定向到特定页面
- android - 无法从服务启动活动
- facebook - Facebook get_started 按钮在点击后不会消失
- unit-testing - 如何使用 Dataflow Pipeline 对 CloudBigTableIO 进行单元测试?