【发布时间】: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