【问题标题】:Spring boot custom starter - Cannot import custom starter classSpring Boot 自定义启动器 - 无法导入自定义启动器类
【发布时间】:2020-03-21 21:15:14
【问题描述】:

我正在开发一个 spring boot 自定义启动器,其中 pom 包含一些依赖项(其他启动器、库),并且这个启动器对 jwt 过滤进行了一些配置,以允许在安全级别进行过滤。问题是当我在另一个项目(starter-consumer)中添加我的自定义启动器作为 pom 依赖项时,它似乎检测到我要导入的类,但 IntelliJ 什么也没做。

也许我没有正确打包启动器,或者至少是我在里面编码的类。启动器在 pom 中包含的其他依赖项已成功添加为启动器-消费者的依赖项。例如,我使用了一些 jwt utils,它们的依赖项位于父启动器中。所以这件事没问题。

import io.jsonwebtoken.impl.DefaultClaims;

问题是当我尝试导入我在启动器中编码的自定义类时。这是我的包结构:

我想在我的 starter-consumer 中使用 JwtConfig 类。它出现了,但我无法导入。它什么都不做。

然后,如果我手动检查包的可用性,我会看到:

Pepito 丢失 :( 并且 theinit 是启动器消费者的包名。jar 安装在本地 m2 中,所以我得到这样的依赖项:

     <dependency>
        <groupId>com.pepito</groupId>
        <artifactId>starter</artifactId>
        <version>0.0.1-SNAPSHOT</version>
    </dependency>

对此有何见解?

编辑 1:

如你所说,我删除了 boot maven 插件,现在看来它没有打包为启动应用程序,我的初学者消费者可以导入我编码的类。另外一件事,豆类会发生什么? autoconfigure 是自己启动 bean 还是 starter-consumer 需要声明它?

编辑 2:

因此,作为本文解决方案的一部分,我正在尝试将一个 bean 从启动器注入到启动器消费者中。

除了另一个 bean 之外,这里还有 jwtTokenAuthenticationFilter,我想将它注入到我的启动者-消费者安全配置中。

    @Configuration
@ConditionalOnProperty(name = "security.jwt-enabled", havingValue = "true")
public class JwtAutoConfiguration  extends AbstractHttpConfigurer<JwtAutoConfiguration, HttpSecurity> {

    @Bean
    public JwtConfig jwtConfig() {
        return new JwtConfig();
    }

    @Bean
    public FilterRegistrationBean registration(@Qualifier("jwtFilter") JwtTokenAuthenticationFilter filter) {
        FilterRegistrationBean registration = new FilterRegistrationBean(filter);
        registration.setEnabled(false);
        return registration;
    }

    @Bean
    public JwtTokenAuthenticationFilter jwtFilter() {
        return new JwtTokenAuthenticationFilter(jwtConfig());
    }

    @Override
    public void init(HttpSecurity http) throws Exception {
        // initialization code
    }
}

这是我的 spring.factories

    # Auto Configure
org.springframework.boot.autoconfigure.EnableAutoConfiguration=\
  com.pepito.starter.configuration.security.jwt.JwtAutoConfiguration

在初学者消费者中,我有以下内容

@Configuration
@EnableWebSecurity
@EnableGlobalMethodSecurity(prePostEnabled = true)
public class WebSecurityConfig extends WebSecurityConfigurerAdapter {

    @Autowired
    private JwtTokenAuthenticationFilter jwtFilter;

这是我在 intellij 中看到的错误,即无法自动装配该 bean,因为它不存在。我想是因为有关扫描的问题,但在我的初学者消费者中,我有 @SpringBootApplication 假设它包含 componentsscan 注释。

【问题讨论】:

  • 您应该将com.petito.starter 设为正确的包,因为您已将目录命名为com.petito.starter,并且没有为每个部分创建目录com/petito/starter ...从我的角度来看,这个问题。我不确定。

标签: java maven spring-boot


【解决方案1】:

我相信我在这里看到的几个问题和一些澄清将帮助您找到答案:

  1. 带启动器的模块是一个普通的 jar。唯一不同的是它有META-INF/spring.factories,我看到它存在。

  2. 话虽如此 - 我在 Pepito 入门模块类中看到了 SpringBootMicroserviceStarterApplication。这是错误的。如果启动器是一个 Spring Boot 应用程序,那么您很可能正在使用 Spring Boot Maven 插件将其准备为一个应用程序。

但是这个插件创建的 jar 并不是真正的 Jar,更具体地说,它将其他 jar 存储在 BOOT-INF lib 中,通常不能被认为是 Jar 构建工具和 IDE。

简单地说你不能声明对打包为spring boot应用程序的依赖项

更新 1 要在 cmets 中解决您的 OP 问题:

启动器不是 Spring Boot 应用程序。它不应该有一个带有@SpringBootApplication注解的方法,它不应该被打包成spring boot应用等等。

查看启动器的最佳方式是作为一个自包含的“功能”或“设施”(试图在英文中找到最合适的词),通过导入启动器模块可以被Spring引导应用程序使用。

在测试方面,@SpringBootTest不应该用在starter的模块中,因为它模仿了spring boot应用程序的启动,这里显然不存在。

可以使用单元测试或 Spring 测试框架对其进行测试:

@RunWith(SpringRunner.class)
@ContextConfiguration(<here comes the class of AutoConfiguration in starter)

这里要澄清的最后一件事:

在 spring 工厂中,您可以指定自动配置,进而声明启动器所需的一系列 bean。

这些 bean 与其他 bean 一样由 Spring Boot 应用程序解析,不同之处在于 Configuration 是从 spring.factories 文件中识别出来的,而不是通过包结构或显式配置来识别的。

所以回答你的问题:

你知道我是否可以在启动器中声明一个 bean,然后在消费者中自动装配它吗?

是的,只要启动器被 Spring Boot 应用程序加载,您就可以将启动器中的 bean 自动装配(或以任何其他方式注入)到 Spring Boot 应用程序本身的 bean 中。

【讨论】:

  • 感谢您的评论马克。我也怀疑包装就像 BOOT-INF 一样。我编辑了我的问题以明确一件事,因为现在我的启动器没有单元测试,因为没有 xxxApplication.java 并且我无法自行检查工作。你知道我是否可以在启动器中声明一个 bean,然后在消费者中自动装配它吗?
  • 不客气。我已经更新了答案以解决您的评论。让我知道是否清楚。
  • 关于最后一个评论标记,当我尝试从启动器自动装配一个 bean 时,intellij 说不能自动装配。未找到该类型的 bean。我将让您在编辑中获得一些见解 2
  • 我检查了更多,当我运行应用程序时我已经成功加载了 bean,但是在 intellij 中它说它与任何声明的 bean 类型都不匹配。可以是intellij错误吗?或者我可以配置的东西?这似乎是唯一的 intellij 问题
  • 有时 intellij 无法识别 bean,尤其是使用 @conditional 注释和通常更“动态”创建的 bean。希望它会在未来版本的想法中有所改进......无论如何,只要您的应用正常运行,它就不应该成为问题
猜你喜欢
  • 2021-06-01
  • 2019-08-30
  • 2020-04-06
  • 1970-01-01
  • 2022-01-24
  • 1970-01-01
  • 1970-01-01
  • 2017-01-18
  • 1970-01-01
相关资源
最近更新 更多