Spring MVC - 在Controller上设置初始化属性

时间:2013-01-01 16:27:00

标签: java spring java-ee spring-mvc properties

我有一个使用外部库的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。

  • 上述方法是否是初始化代码的正确方法,特别是对于控制器?如果对Controller进行第二次调用会发生什么?
  • 由于初始化,值是否为空?即春天还没设定呢?
  • 是否可以从Controller中添加初始化代码?

2 个答案:

答案 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应该被干净地召唤