我有一个使用外部库的Spring MVC,我无法访问代码。此外部库使用标准system.getProperty调用读取一些属性。我必须在使用服务之前设置这些值。
由于我的应用程序是Spring MVC应用程序,我不知道如何初始化这些属性。这是我到目前为止所做的,但由于某种原因我的值总是为空。
我将属性放在属性文件/conf/config.properties
my.user=myuser
my.password=mypassowrd
my.connection=(DESCRIPTION=(LOAD_BALANCE=on)(ADDRESS=(PROTOCOL=TCP)(HOST=xxxx.xxxx.xxxx)(PORT=1521))(ADDRESS=(PROTOCOL=TCP)(HOST=xxx.xxx.xxx)(PORT=1521))(CONNECT_DATA=(SERVICE_NAME=myService)))
然后我在applicationContext.xml
<context:annotation-config/>
<context:property-placeholder location="classpath*:conf/config.properties"/>
我阅读了用于设置初始化代码的文档,您可以实现InitializingBean接口,因此我实现了接口并实现了afterPropertiesSet()方法。
private static @Value("${my.user}") String username;
private static @Value("${my.password}") String password;
private static @Value("${my.connection}") String connectionString;
@Override
public void afterPropertiesSet() throws Exception {
System.setProperty("username",username);
System.setProperty("password",password);
System.setProperty("connectionString",connectionString);
}
问题是,在调用afterPropertiesSet()
方法时,值始终为null。
答案 0 :(得分:2)
您确定bean / controller的定义与您拥有property-placeholder
定义的Spring上下文配置文件相同吗?
看看鲍里斯对这个问题的回答:Spring @Value annotation in @Controller class not evaluating to value inside properties file
如果你想从你的控制器中移动你的代码,你可以添加一个组件来监听spring完成初始化时,并且hen调用代码:
@Component
public class ApplicationStartedListener implements ApplicationListener<ContextRefreshedEvent> {
private static @Value("${my.user}") String username;
private static @Value("${my.password}") String password;
private static @Value("${my.connection}") String connectionString;
public void onApplicationEvent(ContextRefreshedEvent event) {
System.setProperty("username",username);
System.setProperty("password",password);
System.setProperty("connectionString",connectionString);
}
}
答案 1 :(得分:1)
修复应该相当简单,只需从您的字段中删除static
修饰符,然后AutoWiredAnnotationPostProcessor
负责注入使用@AuotWired
和@Value
注释的字段,将能够正确地注入价值,你的afterPropertiesSet
应该被干净地召唤