2010-11-09 101 views
14

所以,我有一個簡單的性質使用以下條目文件:Spring @Value註釋總是評估爲null?

my.value=123 
another.value=hello world 

此屬性文件正在被使用PropertyPlaceHolderConfigurer,它引用的屬性上面的文件加載。

我有以下類,爲此,我想在加載這些屬性,像這樣:

public class Config 
{ 
    @Value("${my.value}") 
    private String mValue; 

    @Value("${another.value}") 
    private String mAnotherValue; 

    // More below... 
} 

的問題是,mValuemAnotherValue總是空...但在我的控制器,該值正在加載很好。是什麼賦予了?

+0

Config類定義爲spring bean嗎? – Raghuram 2010-11-09 04:28:14

+0

不可以?我將如何做註釋? – Polaris878 2010-11-09 04:39:15

+0

我試過在班上使用「@Component」和「@Controller」,都沒有工作 – Polaris878 2010-11-09 04:57:14

回答

18

如果Config的實例正在通過new手動實例化,那麼Spring不會涉及,因此註釋將被忽略。

如果你不能改變你的代碼,以使春實例化的bean(可能使用prototype -scoped豆),那麼另一種選擇是使用Spring的加載時織類加載器功能(見docs)。這是一些低級的AOP,它允許你像往常一樣實例化對象,但是Spring會通過應用上下文來傳遞它們,以使它們連線,配置,初始化等。

它並不適用於所有平臺,所以請閱讀上述文檔鏈接,看看它是否適合你。

+0

嗨skaffman,感謝您的建議......問題是我正在從JSP實例化'Config'。我不確定我能否找到解決辦法?也許通過使用某種工廠? – Polaris878 2010-11-09 16:12:31

+0

@ Polaris878:我的建議仍然適用於JSP實例化對象(通過反射實例化的任何對象) – skaffman 2010-11-09 16:50:46

+0

+1。我詳細地瞭解了Spring。多年沒碰它了。愚蠢的工作場所。 – 2010-11-10 02:25:21

1

由於它與@Controller一起工作,看起來你自己實例化Config。讓Spring實例化它。

+0

啊,是的,這是問題...我自己打電話給構造函數。那麼,我可以訪問這些屬性嗎?如果我無法訪問這些屬性,那基本上意味着我需要找到其他方式來加載配置,因爲如果這些屬性僅在某些情況下可用,則Spring屬性加載器不會削減它。 – Polaris878 2010-11-09 05:04:55

+0

@ Polaris878:讓Spring實例化它。我們有什麼問題嗎?或者使用'ResourceBundle'自己做。 – 2010-11-09 05:07:46

2

<context:spring-configured />添加到您的應用程序上下文文件中。

然後將@Configurable註釋添加到Config類。

13

我有類似的問題,但是是春天的新手。 我試圖性能加載到一個@Service,並試圖用@Value檢索與屬性值...

@Autowired 
public @Value("#{myProperties['myValue']}") String myValue; 

我花了一整天試圖註解的各種組合,但它總是返回null 。 最後,事實之後,答案一如既往顯而易見。

1)確保彈簧被包括包層次結構 在你servlet.xml的掃描您的類註釋(它會掃描低於基準值一切你插入。

2)確保你不是在'剛剛告訴Spring看的那類新課程'。相反,您在@Controller類中使用@Autowire。

Spring中的所有東西都是一個單例,發生了什麼事情是Spring將這些值加載到它的Singleton中,然後我'新建了一個不包含新加載值的類的另一個實例,所以它始終爲空。

改爲在@Controller中使用...

@Autowired 
private MyService service; 

調試...... 有一件事我沒有找到這是如下致以服務...

@Service 
public class MyService implements InitializingBean 

然後把調試語句...

@Override 
public void afterPropertiesSet() throws Exception { 
// TODO Auto-generated method stub 
LOGGER.debug("property myValue:" + myValue);   
} 

在這裏,我可以看到初始化時設置的值,後來當我將它打印到一個方法爲null時,所以這對我來說是一個很好的線索,它不是同一個實例。

這個錯誤的另一個線索是,Tomcat抱怨超時試圖從無法解析HTTPheader的Socket讀取......這是因爲Spring已經創建了服務的實例,所以我有,所以我的一個人在做真正的工作,而春天正在其實例中超時。