2013-01-01 91 views
1

我有一個使用外部庫的Spring MVC,我無法訪問代碼。這個外部庫使用標準的system.getProperty調用來讀取一些屬性。我必須在使用該服務之前設置這些值。Spring MVC - 在控制器上設置初始化屬性

由於我的應用程序是一個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()方法時,這些值始終爲空。

  • 上述方法是否正確初始化代碼,尤其是對於控制器?如果第二次打電話給控制器會發生什麼?
  • 由於初始化,值是否爲空?即春天還沒有設置他們呢?
  • 是否可以添加遠離控制器的初始化代碼?

回答

2

你肯定你的bean /控制器的定義是相同的彈簧背景下的配置文件,你必須在property-placeholder定義是什麼?

看一看鮑里斯這個問題的答案:Spring @Value annotation in @Controller class not evaluating to value inside properties file

如果你想從你的控制器移動你的代碼,你可以添加監聽當春天已經完成初始化一個組件,和母雞調用代碼:

@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); 
    } 
} 
+0

我只有一個applicationContext.xml文件位於WEB-INF文件夾中。 System.setProperty調用都在Controller的無參數構造函數中。也許這就是導致問題的原因。 – ziggy

+0

@ziggy我從你的問題中假設所有的@Value變量都是null。你是說他們的值是正確地從配置文件填充的,但是'System.setProperty()'沒有設置值? –

+0

不,你是正確的,因爲@Value值從未設置,因此它們在到達System.setProperty調用之前爲空。 – ziggy

1

的修復應該是相當簡單的,只是從你的領域,那麼AutoWiredAnnotationPostProcessor負責與@AuotWired@Value註釋字段注入去除static修改,將能夠在注入的CORRE價值ctly和你的afterPropertiesSet應該被打電話乾淨地

+0

這似乎並沒有解決它。使用靜態變量是錯誤的,所以我將它們更改爲實例變量,但屬性仍爲空。 – ziggy