当前位置: 首页 > 知识库问答 >
问题:

Spring boot自定义启动器-无法导入自定义启动器类

卜凯旋
2023-03-14

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

也许我没有正确打包启动器,或者至少我在里面编码的类。启动器在pom中包含的其他依赖项被成功添加为启动器-消费者的依赖项。例如,我使用了一些依赖项在父启动器中的jwt utils。所以那东西工作正常。

import io.jsonwebtoken.impl.DefaultClaims;

问题是,当我尝试导入一个在初学者中编写的自定义类时。这是我的包结构:

我想在初学者消费者中使用JwtConfig类。它出现了,但我无法导入。它什么都不做。

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

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

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

对此有什么见解吗?

编辑1:

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

编辑2:

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

除了另一个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。工厂

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

在starter consumer中,我有以下内容

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

    @Autowired
    private JwtTokenAuthenticationFilter jwtFilter;

这就是我在intellij中看到的错误,它无法自动连接该bean,因为它不存在。我想这是因为扫描的原因,但在我的初学者消费者中,我有@SpringBootApplication,假设它包含componentscan注释。

共有1个答案

司空思聪
2023-03-14

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

>

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

    话虽如此,我在Pepito starter模块类中看到了SpringBootMicroserviceStarterApplication。这是错误的。如果starter是一个spring boot应用程序,那么很可能您正在使用spring boot maven插件将其作为应用程序进行准备。

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

    简单地说,您不能声明对打包为spring boot应用程序的东西的依赖关系!

    更新1以解决OP在评论中的问题:

    启动器不是Spring启动应用程序。它不应该有一个用@SpringBootApplication注释的方法,它不应该打包为Spring启动应用程序等等。

    查看starter的最佳方式是作为一个自包含的“功能”或“设施”(试图找到最合适的英语单词),Spring boot应用程序可以通过导入starter模块来使用它。

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

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

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

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

    在Spring工厂中,您可以指定自动配置,该自动配置依次声明启动器所需的一系列bean。

    与其他bean一样,这些bean由Spring Boot应用程序解决,不同之处在于配置是在spring中识别的。工厂文件,而不是按包结构或显式配置。

    因此,要回答您的问题:

    你知道我是否可以在启动程序中声明一个bean,然后在消费者中自动连接它吗?

    是的,只要starter由spring boot应用程序加载,就可以将starter中的bean自动连接(或以任何其他方式注入)到spring boot应用程序本身的bean中。

  •  类似资料:
    • 我正在我的项目中使用模块,该模块公开了要监视的RESTendpointURL 默认情况下,仅公开 和 终结点。 根据我的使用案例,我正在通过< code > application . properties 文件自定义endpoint。 我想了解,Spring启动究竟在哪里为和创建实际的endpoint,以及它如何通过HTTP公开它们?

    • 应用服务启动可以在多个地方进行调整,以下介绍两种方案,Dockerfile 和 平台详情页调整 Dockerfile CMD启动方式 看一下简单的例子: FROM hub.kpaas.nsini.com/app/hello:v0.0.3 CMD ["/go/bin/hello"] 启动命令写在CMD这个后面,如果后面有多个参数可以以逗号隔开例如: CMD ["static-web", "-pa

    • 在很多的 Linux 环境中,你可以通过修改文件 .desktop 来在它的启动器中添加自定义条目。 关于Canonical 的 Unity 启动器文档, 参考 Adding Shortcuts to a Launcher. 可以通过 freedesktop.org Specification网站,找到更详细的参考信息。 Audacious 的启动器快捷方式: 一般情况下,在快捷键menu中为每一

    • 我们有一个Spring booter应用程序,它的父级定义为spring-boot-starter-父级。但在我们的项目中,我们有一个父pom,其中定义了分发管理,项目中的所有子模块都继承自它。现在,由于Spring booter应用程序已经继承自spring-boot-starter-父级,并且我不想重复分发管理,我想拥有一个自定义的Spring booter模块,以便能够在其中定义分发管理,然

    • 我们在这个项目上有一个微服务架构,我们使用普罗米修斯和格拉法纳进行监控。这些服务是使用Spring启动实现的,并且通过Spring启动执行器与普罗米修斯集成。该项目中有一些Kafka消费者,并且对于每个@KafkaListenerSpring都会生成一些指标。下面是用于指标的普罗米修斯时间序列 < code > org . spring framework . Kafka . kafkaliste

    • 我想使用actuator为我的spring boot rest web服务实现自定义度量或统计信息,但我找不到简单的教程。例如: 如何显示某个控制器被调用了多少次以及填充了什么确切的参数字段? 我如何创建一个指标,当它的URL被调用时,它会运行某些查询并显示带有某些结果的json