1. 程式人生 > >spring @vaule獲取不到值

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"/>