使用@value注解取不到application.xml配置文件中的值问题
目录
- @value注解取不到application.xml的值
- 报错信息
- 原来代码
- 问题原因
- 思考
- 拓展阅读
- 工具类@Value取不到值
- 原因是new的对象
@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 directoryfiltering
:指定是否将filter文件(即build下的filters里定义的*.property文件)的变量值在这个resource文件有效,例如上面就指定那些变量值在configuration文件无效。directory
:指定属性文件的目录,build的过程需要找到它,并且将其放到targetPath下,默认的directory是${basedir}/src/main/resourcesincludes
:指定包含文件的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容器管理。
以上为个人经验,希望能给大家一个参考,也希望大家多多支持我们。