在JavaBean文件中使用Spring的@Value注解获取配置文件.yml或资源文件.properties中 key - value 键值信息
@Value("${stu.number}")
private String number;
当键值为 number: 00201000331100 number为String 类型
如果value值不为0开头,则数据可以正常解析;
如果value值为0开头,则数据会按数字类型(进制转换)进行解析 00201000331100 被解析成 17314198080
这里有两组数据:
第一组数据:按照八进制解析成十进制
00201000331100 八进制
17314198080 十进制
第二组数据: 直接解析成十进制
020099200049 十进制
2.0099200049E10 十进制
那么我们想要解析的是字符串怎么办?
只要在value值中添加双引号即可按照字符串正常解析,具体的解析原理要去看@Value注解的解析过程相关源码
number: "00201000331100"
#################################################################
鉴于对以上两组数据解析方式的不同,引发深度思考,最终将问题定位于SpEl表达式解析数据方式上
public class TestSpEl { public static Logger logger = Logger.getLogger(TestSpEl.class); public static void main(String[] args) { ExpressionParser parser = new SpelExpressionParser(); logger.info("" + parser.parseExpression("'Hello World'").getValue()); logger.info("" + parser.parseExpression("6.0221415E+23").getValue()); logger.info("" + parser.parseExpression("0x7FFFFFFF").getValue()); logger.info("" + parser.parseExpression("true").getValue()); logger.info("" + parser.parseExpression("'00201000331100'").getValue()); logger.info("" + parser.parseExpression("20100033110F").getValue()); logger.info("" + parser.parseExpression("20100033110D").getValue()); logger.info("" + parser.parseExpression("20100033110L").getValue()); logger.info("" + parser.parseExpression("02009920049").getValue()); } }
对应的执行结果如下:
14:03:59.734 [main] INFO org.galsang.TestSpEl - Hello World 14:03:59.738 [main] INFO org.galsang.TestSpEl - 6.0221415E23 14:03:59.738 [main] INFO org.galsang.TestSpEl - 2147483647 14:03:59.739 [main] INFO org.galsang.TestSpEl - true 14:03:59.739 [main] INFO org.galsang.TestSpEl - 00201000331100 14:03:59.739 [main] INFO org.galsang.TestSpEl - 2.01000325E10 14:03:59.739 [main] INFO org.galsang.TestSpEl - 2.010003311E10 14:03:59.739 [main] INFO org.galsang.TestSpEl - 20100033110 14:03:59.739 [main] INFO org.galsang.TestSpEl - 2009920049