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

时间:2019-11-26 12:38:06

标签: java maven spring-boot

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

也许我没有正确包装启动器,或者至少没有包装我在其中编码的类。启动器包含在pom中的其他依赖项已成功添加为启动器消费者的依赖项。例如,我使用一些jwt utils,它的依赖关系在父启动器中。这样就可以了。

import io.jsonwebtoken.impl.DefaultClaims;

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

enter image description here

我想在我的入门用户中使用JwtConfig类。它出现了,但是我不能导入。它什么都不做。

enter image description here

然后,如果我手动检查软件包的可用性,则会看到以下内容:

enter image description here

缺少Pepito :(并且init是入门用户的软件包名称。jar安装在本地m2中,所以我得到了这样的依赖关系:

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

对此有何见解?

编辑1:

我按照您所说的删除了boot maven插件,现在看来它并未打包为启动应用程序,我的入门用户可以导入我编写的clase。另外一件事,豆子会怎样?自动配置是自行启动Bean还是入门者需要声明它?

编辑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,它应该包含componentscan批注。

1 个答案:

答案 0 :(得分:1)

我相信我在这里看到的一些问题以及一些说明将有助于您找到答案:

  1. 带有启动程序的模块是一个常规jar。唯一不同的是它具有META-INF/spring.factories,据我所知。

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

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

简单地说,您不能声明依赖于打包为Spring Boot应用程序的东西

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

启动器不是Spring Boot应用程序。它不应具有用@SpringBootApplication注释的方法,也不应打包为spring boot应用程序,依此类推。

查看启动程序的最佳方法是作为独立的“功能”或“功能”(试图找到最合适的英语单词),Spring引导应用程序可以通过导入启动程序模块来使用它们。

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

可以使用单元测试或Spring Testing Framework对其进行测试:

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

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

在springfactories中,您可以指定自动配置,依次声明启动程序所需的一系列bean。

这些bean像其他bean一样由spring boot应用程序解决,不同之处在于配置是从spring.factories文件中标识出来的,而不是由包结构或显式配置来标识的。

所以回答您的问题:

  

您知道我是否可以在启动程序中声明一个bean,然后在使用者中将其自动装配吗?

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