我正在尝试使用@Value注释读取application.properties文件中的内容。但它总会返回null。
**Sample Java code**
@Component
public class SampleClass() implements Runnable{
@Value("${profile.name}")
private String name;
@Override
public void run(){
System.out.println("Name: " + name);
...
}
}
**Application.properties**
profile.name=myname
**Pom.xml**
<profiles>
<profile>
<id>dev</id>
<properties>
<activatedProperties>dev</activatedProperties>
</properties>
</profile>
<profile>
<id>stag</id>
<properties>
<activatedProperties>stag</activatedProperties>
</properties>
</profile>
<profile>
<id>prod</id>
<properties>
<activatedProperties>prod</activatedProperties>
</properties>
</profile>
</profiles>
....
<build>
<resources>
<resource>
<directory>src/main/resources</directory>
<filtering>true</filtering>
<includes>
<include>**/*.properties</include>
</includes>
</resource>
</resources>
</build>
我甚至试过给变量一个默认值,它仍然返回null。
@Value("${profile.name:'samplename'}")
为什么?
更新
我设法现在在SampleClass()中检索profile.name值。但我不确定我的方式是否正确。 SampleClass1将调用SampleClass2。
示例Java 1代码
@Component
public class SampleClass1(){
@Autowired
SampleClass2 sampleClass2;
@Value("${profile.name}")
private String profileName;
sampleClass2.setName(profileName);
//Invoke SampleClass2
}
示例Java 2代码
@Component
public class SampleClass2() implements Runnable{
private String profileName;
public void setName(String profileName){
this.profileName= profileName;
}
@Override
public void run(){
System.out.println("Name: " + profileName);
...
}
}
答案 0 :(得分:0)
您的SampleClass必须是Bean。为您的班级添加注释,例如@Component
让Spring在扫描期间找到它并分配值。
答案 1 :(得分:0)
要清楚。
48 48 48 48 87 50 48
0 0 0 0 w 2 0
在application.properties
中@Component
@Getter
public class SampleComponentClass {
@Value("${profile.name}")
private String profileName;
}
@Component
Class SomeOtherClass{
@Autowired
SampleComponentClass sampleComponentClass;
public void someMethod(){
System.out.println(sampleComponentClass.getProfileName()); // prints testprofile
SampleComponentClass sampleComponentClass1 = new SampleComponentClass();
System.out.println(sampleComponentClass1.getProfileName()); // prints null
}
}
答案 2 :(得分:0)
在配置类中注入值并使用自动装配注释使用此组件的实例可能是更好的方法。
@Configuration
public class SomeConfig {
@Value("${profile.name}")
private String profileName;
@Bean
public SampleClass1 sampleClass1(){
SampleClass1 sampleClass1 = new Sampleclass1();
// This approach, you can make additional control and configuration here
sampleClass1.setProfileName(profileName);
return sampleClass1;
}
@Bean
public SampleClass2 sampleClass2(){
return new SampleClass2();
}
}
无论您需要SampleClass1
public class SomeClass{
@Autowired
private SampleClass1 sampleClass1;
}