首頁 > 軟體

使用@value註解取不到application.xml組態檔中的值問題

2022-03-21 16:01:57

@value註解取不到application.xml的值

報錯資訊

今天從碼雲上拉下來程式碼,突然發現系統跑不起來了,報錯資訊如下:

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'shiroConfig': Injection of autowired dependencies failed; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder 'spring.cache.type' in value "${spring.cache.type}"

開發組最近都忙著寫業務層程式碼,一般來說不會碰組態檔裡的東西,莫名其妙就出現了這個錯誤。

原來程式碼

Java程式碼如下:

@Configuration
public class ShiroConfig {    
    @Value("${spring.cache.type}")
    private String cacheType;
    @Value("${server.session-timeout}")
    private int tomcatTimeout;
}

組態檔:

pom.xml原檔案:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*.xml</include>
            </includes>
        </resource>
    </resources>
</build>

問題原因

pom.xml中的resource設定的不正確

pom.xml修改後:

<build>
    <resources>
        <resource>
            <directory>src/main/java</directory>
            <includes>
                <include>**/*</include>
            </includes>
        </resource>
    </resources>
</build>

思考

比較神奇的是,修改pom檔案後啟動成功了,然後再把它改回原來的樣子,也不會報錯了。Maven clean,Rebuild Project等操作後重啟也都可以的。有點搞不懂。

拓展閱讀

  • resources:描述工程中資源的位置 
  • targetPath:指定build資源到哪個目錄,預設是base directory
  • filtering:指定是否將filter檔案(即build下的filters裡定義的*.property檔案)的變數值在這個resource檔案有效,例如上面就指定那些變數值在configuration檔案無效。
  • directory:指定屬性檔案的目錄,build的過程需要找到它,並且將其放到targetPath下,預設的directory是${basedir}/src/main/resources
  • includes:指定包含檔案的patterns,符合樣式並且在directory目錄下的檔案將會包含進project的資原始檔。
  • excludes:指定不包含在內的patterns,如果inclues與excludes有衝突,那麼excludes勝利,那些符合衝突的樣式的檔案是不會包含進來的。
  • testResources:這個模組包含測試資源元素,其內容定義與resources類似,不同的一點是預設的測試資源路徑是${basedir}/src/test/resources,測試資源是不部署的。

一般情況下:

如果沒有指定resources,自動會將classpath下的src/main/java下的.class檔案和src/main/resources下的.xml檔案放到target裡頭的classes資料夾下的package下的資料夾裡。

如果設定了resources,那麼預設的就會失效,就會以指定的includes和excludes為準。

例如,為了使打包的jar包裡頭包含.java原始檔。

工具類@Value取不到值

工具類裡@Value取不到值,如下圖

原因是new的物件

改為

EncryptIdCardUtil類方法改為非靜態方法,ConnectService類由new改為@Autowired注入

RiskService裡也由直接呼叫EncryptIdCardUtil裡的靜態方法,改為EncryptIdCardUtil類@Autowired注入

就可以了

總結:

1.@Value不能靜態成員上使用;

2.使用@Value讀取屬性值的類物件需要交給spring容器管理。

以上為個人經驗,希望能給大家一個參考,也希望大家多多支援it145.com。


IT145.com E-mail:sddin#qq.com