首页 > 解决方案 > 在 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.FilterASSIGNABLE_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.FilterREGEX

@ConfigurationPropertiesScan("com.mycomp.package")
@ComponentScan(excludeFilters={
    @ComponentScan.Filter(type= FilterType.REGEX, pattern = "graphql.kickstart.spring.webflux.GraphQLController")})
@SpringBootApplication
public class Application {
  ....
}

这似乎也不起作用

也试过@ComponentScan.FilterCUSTOM

@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. 事实上,我打印了所有的fullyQualifiedNameit 扫描文件,并且只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

在这种情况下是否有禁用或替换它的方法?

标签: springspring-bootspring-restcontrollergraphql-java

解决方案


推荐阅读