org.springframework.beans.factory.BeanCreationException: Error
creating bean with name ‘XXXServiceIpml’: Injection of
autowired dependencies failed; nested exception is
org.springframework.beans.factory.BeanCreationException: Could not autowire field: private java.lang.String com.XX.service.ipml.XXServiceIpml.ABCD; nested exception is java.lang.IllegalArgumentException: Could not resolve placeholder ‘XXX_URL’ in string value “${XXX_URL}”
具体检查以下几点:
(1)@Value是否引对包
(2)对应active环境的application.properties配置文件是否有这个参数,特别留意多环境情况下的:dev,local,staging,pre,qa,prod,参数名称是否写对
(3)代码中这个变量如果写出static的,也会赋值失败,final的更加不行
(4)没有加容器注解的类无法使用,也就是说,要使用@Value,当前Class必须交由spring容器管理,也就是必须加上@Controller,@Service,@Component,@Repository…这一类注解
(5)使用被Spring容器管理的类,只能通过@Autowrite方式注入其单例进行使用,不能自己new 一个出来,否则失效
(6)如果上述问题都检查无误,那么这也是我踩的一个坑,是项目的配置出的问题,按照正常来说,application.properties配置一个XXX_URL=XXXXXXX 之后,在方法中可以用@Value的形式获取,但是偏偏这一次怎么拿都不行,也排查了一堆原因,后来发现:
结论:
假如你的项目是设置了不同环境指定读取对应的properties,就很容易出现这个问题,这个时候就要求每个环境的properties都要配置一下那个参数,不然就读取不到
或者把其它applicationContext-XX.xml的各种不同环境的XML的引入proerties的配置文件的标签删除,
然后再修改applicationContext.xml;让它统一加载全部的properties:
这样也可以