我正在开发一个Spring Boot定制启动程序,其中pom包含一些依赖项(其他启动程序,库),并且该启动程序对jwt过滤进行了一些配置,以允许过滤器处于安全级别。问题是,当我在另一个项目(starter-consumer)中将自定义启动程序添加为pom依赖项时,似乎检测到了我要导入的类,但是IntelliJ却什么也没有。
也许我没有正确包装启动器,或者至少没有包装我在其中编码的类。启动器包含在pom中的其他依赖项已成功添加为启动器消费者的依赖项。例如,我使用一些jwt utils,它的依赖关系在父启动器中。这样就可以了。
import io.jsonwebtoken.impl.DefaultClaims;
问题是当我尝试导入在入门中编码的自定义类时。这是我的包裹结构:
我想在我的入门用户中使用JwtConfig类。它出现了,但是我不能导入。它什么都不做。
然后,如果我手动检查软件包的可用性,则会看到以下内容:
缺少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批注。
答案 0 :(得分:1)
我相信我在这里看到的一些问题以及一些说明将有助于您找到答案:
带有启动程序的模块是一个常规jar。唯一不同的是它具有META-INF/spring.factories
,据我所知。
话虽如此-我在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中。