spring @vaule獲取不到值
1)當SpringMVC與Spring整合使用的時候,在Controller中無法獲取@Value對應的值。(剛開始我就是這種情況,,,,)
產生原因: 只在applicationContext中添加了掃描,沒有在SpringMVC對應的配置檔案中掃描。
applicationContext載入的是父容器,,父容器在專案啟動的時候就被載入了。SpringMVC對應的配置檔案載入的是子容器,子容器可以訪問父容器的物件,但是不能訪問載入的配置檔案。所以,如果想在SpringMVC中使用載入的配置檔案,需要在SpringMVC對應的配置檔案中新增相應的配置即可。
2)在service或者dao層無法獲取@Value的數值。
可能情況:有多個applicationContext.xml檔案,裡面有多個context:property-placeholder,在web容器啟動的時候同時載入了這些配置檔案,這時候只會有一個配置檔案中的context:property-placeholder會被載入,其他的不會被載入。
那麼,當需要載入多個properties的時候,如何解決?可以用下面的方法
<context:property-placeholder location="classpath:resource/*.properties"/>
這樣,將所有需要載入的properties放在一個目錄之下,通過*.properties就可以載入所有的properties檔案。
@Value("${enable-upload-image}") private String enable;
如上所示,同樣的程式碼,寫在在業務層,執行時能取到正確的值,但在控制層卻取得了@Value註解中的Key(@Value註解有個特點,如果取不到值,那麼不是返回一個null,而是返回Key)。
原因是controller註冊在dispatcherservlet-servlet.xml代表的Spring MVC的容器中,而service則註冊在application-context.xml代表的Spring的容器中。
如果context:property-placeholder只註冊在Spring的容器中,那麼自然只有業務層的類可以取到enable-upload-image的值,而控制器取不到值。
解決方法就是把各種context:property-placeholder在兩個容器中都註冊一下
spring mvc是spring的子容器,需要在兩個配置檔案中都匯入配置檔案
<context:property-placeholder location="classpath:jdbc.properties" ignore-unresolvable="true"/>