我的Spring启动应用程序具有以下应用程序结构:
这是我的application.properties文件:
logging.level.org.springframework=TRACE
logging.level.org.hibernate=ERROR
spring.resources.chain.strategy.content.enabled=true
spring.resources.chain.strategy.content.paths=/**
#spring.resources.chain.cache=false
#spring.resources.chain.html-application-cache=false
#spring.headers.cache=false
language=java
我有一个类需要使用该语言= java属性。这就是我试图使用它的方式:
public class EntityManager {
@Value("${language}")
private static String newLang;
public EntityManager(){
System.out.println("langauge is: " + newLang);
}
}
由于某种原因,打印的值总是" null" !我也尝试将它放在类声明之上:
@PropertySource(value = "classpath:application.properties")
答案 0 :(得分:11)
可以通过多种方式实现,请参阅下文。
@Configuration
@PropertySource("classpath:application.properties")
public class EntityManager {
@Value("${language}")
private static String newLang;
@Bean
public static PropertySourcesPlaceholderConfigurer propertyConfigInDev() {
return new PropertySourcesPlaceholderConfigurer();
}
}
OR
@Configuration
@PropertySource("classpath:application.properties")
public class EntityManager {
@Autowired
private Environment env;
public void readProperty() {
env.getProperty("language");
}
}
答案 1 :(得分:5)
如果您使用Spring启动,如果您使用的是Spring启动程序父启动,则不需要@PropertySource("classpath:application.properties")
,只需删除static
关键字即可开始工作。
答案 2 :(得分:2)
有时,src/main/resources
的类路径条目包含排除标记。如果此排除项目列表中存在application.properties
,则@PropertySource("classpath:application.properties")
将无法找到属性文件。
手动从[.classpath][1]
文件中删除src/main/resources
的排除条目,或使用Eclipse中的配置构建路径选项并转到“源”选项卡。然后从src
中删除排除条目。
答案 3 :(得分:1)
在类
之上缺少构造型注释@Component
public class EntityManager {
@Value("${language}")
private static String newLang;
public EntityManager(){
System.out.println("langauge is: " + newLang);
}
}
答案 4 :(得分:1)
好吧我用绝望的行为弄清楚了。我添加了
@PropertySource("classpath:application.properties")
属性但由于某种原因它仍然没有工作。
然后我删除了"静态"修饰符,它工作!
我不确定为什么没有"静态"在那里,但确实如此。如果可以向我解释这将是非常好的,因为这一切都令人困惑。
答案 5 :(得分:1)
创建你的豆
@Configuration
@PropertySource("classpath:application.properties")
public class ApplicationBeansConfig {
@Autowired
Environment env;
@Bean
public IApplicationBeanService getService(){
return new ApplicationBeansService(env);
}
}
然后在服务构造函数
中@Service
public class ApplicationBeansService implements IApplicationBeanService {
...
public ApplicationBeansService(Environment env){
...
String value = env.getProperty("your.value")
...
}
...
}
不要忘记填写你的application.properties:
your.value = some-string-value
答案 6 :(得分:1)
正如上面第二个答案中所提供的,我确实在使用spring boot,因此删除了static关键字,从而解决了我的问题。确保使用@Value定义的属性没有静态值。
答案 7 :(得分:0)
您可以尝试使用@PropertySource
并为其指定属性文件的路径,您可以在下面找到示例:
@Component
@PropertySource("classpath:application.properties")
public class EntityManager {
@Value("${language}")
private static String newLang;
public EntityManager(){
System.out.println("langauge is: " + newLang);
}
}
答案 8 :(得分:0)
可能不是您正在寻找的确切解决方案,但您也可以声明属性源bean:
答案 9 :(得分:0)
此外,该类与声明为@SpringBootApplication的类完全不同。我了解到Spring Boot和自动组件扫描必须认真考虑软件包名称和位置。我的5分
答案 10 :(得分:0)
如果您在 Spring Bean 完全初始化之前尝试读取属性文件中的值,则该值始终为 null,例如,当从构造函数调用该值时。我就是这种情况。
要解决这个问题,请像这样使用@PostConstruct 注解:
@Configuration
public class CustomConfiguration {
Logger logger = Logger.getLogger(CustomConfiguration.class.getSimpleName());
@Value("${test.value}")
private String testValue;
@PostConstruct
public void initializeApplication() {
logger.info("============================================>"+testValue);
}
在调用 testValue
之前,请确保您没有尝试在其他任何地方使用 initializeApplication
的值。