Spring-启动多模块无法从另一个模块读取属性文件
Spring-Boot multi module unable to read properties file from another module
我搜索了 High 和 low 仍然找不到这个非常烦人的问题的简单答案,
我遵循了这个很棒的指南:
JWT with multi service app
一切都很好,但在指南的最后,我们建议创建一个 config-service(module) ,我已经完成了。
问题是我无法覆盖 JwtConfig 的默认配置 class
项目结构如下:
-config-service
| JwtConfig.java
\
| resources
\
| jwtConfig.properties
-other-service (add dependency in the pom file of the config-service)
|
someOtherclass.java (import the JwtConfig class & using @Bean to initialize )
JwtConfig class:
/*all the imports*/
@PropertySource(value = "classpath:jwtConfig.properties")
public class JwtConfig {
@Value("${security.jwt.uri:/auth/**}")
private String Uri;
@Value("${security.jwt.header:Authorization}")
private String header;
@Value("${security.jwt.prefix:Bearer }")
private String prefix;
@Value("${security.jwt.expiration:#{24*60*60}}")
private int expiration;
@Value("${security.jwt.secret:JwtSecretKey}")
private String secret;
//getters
someOtherclass.java:
/*imports*/
@Configuration
@EnableWebSecurity
public class SecurityCredentialsConfig extends WebSecurityConfigurerAdapter
{
private JwtConfig jwtConfig;
@Autowired
public void setJwtConfig(JwtConfig jwtConfig) {
this.jwtConfig = jwtConfig;
}
@Bean
public JwtConfig jwtConfig() {
return new JwtConfig();
}
/*other code*/
问题是我在 jwtConfig.properties 文件中输入什么参数并不重要,
例如:
security.jwt.uri=test
当其他服务加载它时,它不会出现在 JwtConfig bean 中。
仅加载默认的@Value。
有人可以提供任何建议吗?我该如何解决?
非常感谢!
看过 Mikhail Kholodkov 之后 post(谢谢!),
解决方法是在using服务执行点添加如下注解:
@PropertySources({
@PropertySource("classpath:jwtConfig.properties"),
@PropertySource("classpath:app.properties")
})
public class OtherServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OtherServiceApplication.class, args);
}
}
我认为不使用 @PropertySources ,更好和更合适的方法是在包含 "main method" 的模块中使用 @ComponentScan。由于您需要 JWTConfiguration class 的实例而不是实际的 .属性 文件,因此更建议公开 bean 并制作 spring从另一个模块引导扫描它,而不是暴露 属性 文件(因为这使得另一个模块中的 jwtConfiguration.java 文件变得毫无用处。)所以你可能会尝试这样的事情
假设我们有两个模块——主模块中的 Module1 和 Module2(只有 pom)。我想你知道无代码模块只是将应用程序打包为 "pom" 并描述
中的依赖模块的技巧
你的主 pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>XXX</groupId>
<artifactId>XXXX</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>ws-cms-engine</name>
<url>http://maven.apache.org</url>
<properties>
<spring-boot.version>2.0.0.RELEASE</spring-boot.version>
<spring-kafka.version>2.2.3.RELEASE</spring-kafka.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
............
............
<modules>
<module>Module1</module>
<module>Module2</module>
</modules>
现在让我们考虑一下您的 JWTConfiguration 在 Module1 中,它使用声明的资源文件夹中的 属性 文件 - application.properties
样本JWTConfiguation.java文件
package common.module2.config
@Configuration
@PropertySources("classpath:application.properties")
public class JWTConfiguration{
@Value("${config1}")
private String someConfig;
}
现在,如果您的模块 2 具有需要使用此配置的主要 class,那么这样的事情可能有意义
我们需要让 SpringBoot 容器从 module1 中声明的 bean 中读取,而不是读取实际的 属性 文件
@ComponentScan(basepackages={"common.module2.config", "common.module1.this.config"})
@SpringBootApplication
public class Application(){
public static void main(String args[]){
SpringApplication.run(Application.class);
}
}
所以这里通知在module2包中声明的bean需要spring容器在启动和初始化的时候扫描
现在您可以在所需的服务中自动装配 bean 并使用它
@Service
public class SampleService{
@Autowired
JWTConfiguration config;
}
这应该会自动装配 JWTConfiguration 的托管实例供您使用
我搜索了 High 和 low 仍然找不到这个非常烦人的问题的简单答案,
我遵循了这个很棒的指南: JWT with multi service app 一切都很好,但在指南的最后,我们建议创建一个 config-service(module) ,我已经完成了。
问题是我无法覆盖 JwtConfig 的默认配置 class
项目结构如下:
-config-service
| JwtConfig.java
\
| resources
\
| jwtConfig.properties
-other-service (add dependency in the pom file of the config-service)
|
someOtherclass.java (import the JwtConfig class & using @Bean to initialize )
JwtConfig class:
/*all the imports*/
@PropertySource(value = "classpath:jwtConfig.properties")
public class JwtConfig {
@Value("${security.jwt.uri:/auth/**}")
private String Uri;
@Value("${security.jwt.header:Authorization}")
private String header;
@Value("${security.jwt.prefix:Bearer }")
private String prefix;
@Value("${security.jwt.expiration:#{24*60*60}}")
private int expiration;
@Value("${security.jwt.secret:JwtSecretKey}")
private String secret;
//getters
someOtherclass.java:
/*imports*/
@Configuration
@EnableWebSecurity
public class SecurityCredentialsConfig extends WebSecurityConfigurerAdapter
{
private JwtConfig jwtConfig;
@Autowired
public void setJwtConfig(JwtConfig jwtConfig) {
this.jwtConfig = jwtConfig;
}
@Bean
public JwtConfig jwtConfig() {
return new JwtConfig();
}
/*other code*/
问题是我在 jwtConfig.properties 文件中输入什么参数并不重要,
例如:
security.jwt.uri=test
当其他服务加载它时,它不会出现在 JwtConfig bean 中。
仅加载默认的@Value。
有人可以提供任何建议吗?我该如何解决? 非常感谢!
看过 Mikhail Kholodkov 之后 post(谢谢!),
解决方法是在using服务执行点添加如下注解:
@PropertySources({
@PropertySource("classpath:jwtConfig.properties"),
@PropertySource("classpath:app.properties")
})
public class OtherServiceApplication {
public static void main(String[] args) {
SpringApplication.run(OtherServiceApplication.class, args);
}
}
我认为不使用 @PropertySources ,更好和更合适的方法是在包含 "main method" 的模块中使用 @ComponentScan。由于您需要 JWTConfiguration class 的实例而不是实际的 .属性 文件,因此更建议公开 bean 并制作 spring从另一个模块引导扫描它,而不是暴露 属性 文件(因为这使得另一个模块中的 jwtConfiguration.java 文件变得毫无用处。)所以你可能会尝试这样的事情
假设我们有两个模块——主模块中的 Module1 和 Module2(只有 pom)。我想你知道无代码模块只是将应用程序打包为 "pom" 并描述
中的依赖模块的技巧你的主 pom
<?xml version="1.0" encoding="UTF-8"?>
<project xmlns="http://maven.apache.org/POM/4.0.0" xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xsi:schemaLocation="http://maven.apache.org/POM/4.0.0 http://maven.apache.org/maven-v4_0_0.xsd">
<modelVersion>4.0.0</modelVersion>
<groupId>XXX</groupId>
<artifactId>XXXX</artifactId>
<packaging>pom</packaging>
<version>1.0</version>
<name>ws-cms-engine</name>
<url>http://maven.apache.org</url>
<properties>
<spring-boot.version>2.0.0.RELEASE</spring-boot.version>
<spring-kafka.version>2.2.3.RELEASE</spring-kafka.version>
</properties>
<dependencyManagement>
<dependencies>
<dependency>
<!-- Import dependency management from Spring Boot -->
<groupId>org.springframework.boot</groupId>
<artifactId>spring-boot-dependencies</artifactId>
<version>${spring-boot.version}</version>
<type>pom</type>
<scope>import</scope>
</dependency>
............
............
<modules>
<module>Module1</module>
<module>Module2</module>
</modules>
现在让我们考虑一下您的 JWTConfiguration 在 Module1 中,它使用声明的资源文件夹中的 属性 文件 - application.properties
样本JWTConfiguation.java文件
package common.module2.config
@Configuration
@PropertySources("classpath:application.properties")
public class JWTConfiguration{
@Value("${config1}")
private String someConfig;
}
现在,如果您的模块 2 具有需要使用此配置的主要 class,那么这样的事情可能有意义
我们需要让 SpringBoot 容器从 module1 中声明的 bean 中读取,而不是读取实际的 属性 文件
@ComponentScan(basepackages={"common.module2.config", "common.module1.this.config"})
@SpringBootApplication
public class Application(){
public static void main(String args[]){
SpringApplication.run(Application.class);
}
}
所以这里通知在module2包中声明的bean需要spring容器在启动和初始化的时候扫描
现在您可以在所需的服务中自动装配 bean 并使用它
@Service
public class SampleService{
@Autowired
JWTConfiguration config;
}
这应该会自动装配 JWTConfiguration 的托管实例供您使用