1

我有一个 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()方法时这些值始终为空。

  • 上述方法是初始化代码的正确方法,尤其是对于控制器吗?如果第二次调用 Controller 会发生什么?
  • 由于初始化,值是否为空?即春天还没有设置它们吗?
  • 是否可以在控制器之外添加初始化代码?
4

2 回答 2

2

您确定您的 bean/controller 的定义与您的定义在同一个 spring 上下文配置文件中property-placeholder吗?

看看鲍里斯对这个问题的回答:@Controller 类中的 Spring @Value annotation not evaluate to value inside properties file

如果你想从你的控制器中移动你的代码,你可以添加一个组件来监听 spring 何时完成初始化,然后调用代码:

@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);
    } 
}
于 2013-01-01T16:34:30.690 回答
1

修复应该相当简单,只需static从您的字段中删除修饰符,然后AutoWiredAnnotationPostProcessor负责注入用@AuotWiredand注释的字段@Value,将能够正确注入值并且您afterPropertiesSet应该被干净地调用

于 2013-01-01T21:47:47.540 回答