1.背景
刚到公司,改造现有项目,个人比较喜欢yaml的格式方式,想把原有的properties换成yaml.
2.实现
spring.xml
<bean id="yamlProperties" class="org.springframework.beans.factory.config.YamlPropertiesFactoryBean">
<property name="resources" value="classpath:config/application.yml"/>
</bean>
<context:property-placeholder local-override="true" properties-ref="yamlProperties"/>
application.yml
## topic order
mq:
recv_order_topic: 100828
recv_order_topic_client_id: 6
recv_settlement_result_topic: 101634
recv_settlement_result_topic_client_id: 1
send_commission_data_subject: 101635
项目跑起来,发现@value无法获取值,无语中。。。
3.分析
因为spring进行占位符替换是通过PropertyPlaceholderConfigurer这个类进行的,所以我们找到这个类,并在以下方法处打断点调试
运行项目,停在断点处
于是一步一步执行进行调试,
在执行到java.util.Properties类的getProperty方法时发现问题
断点图如下
- 问题:因为取出来的值非String类型的,所以被抛弃了,也没有任何提示信息
- 分析:产生原因就是YamlPropertiesFactoryBean在解析我的yaml文件时,将数据解析成Integer类型的,但是Properties在获取值的时候只获取String类型的值,造成无法取到值,自然无法注入。
提示: @Value是通过Autowired进行注入的,有兴趣的可以看一下AutowiredAnnotationBeanPostProcessor类的inject方法,自己debug一下
4.解决办法
知道了原因,那解决办法很简单,在yml里强制标识数字为字符串类型即可
## topic order
mq:
recv_order_topic: "100828"
recv_order_topic_client_id: "6"
recv_settlement_result_topic: "101634"
recv_settlement_result_topic_client_id: "1"
send_commission_data_subject: "101635"
再次运行项目,断点图如下
可以成功取到值了。