记录人力系统线上的问题。
最近在更新了用车和出差模块的代码。但是出现了一些问题。当用车和出差推送钉钉审批的时候,发现审批详情页面无法打开。
开始以为是一些数据关键数据没有保存造成的页面无法打开,但是在pc端同一条数据是可以正常打开审批,所以排除数据问题。
再次看钉钉上页面,发现网页打开的地址前缀是是测试地址,但是发布的时候没有修改钉钉的配置类文件类啊,怎么会出现这样的问题。
先查看正式服务器上的class文件,通过反编译工具反编译后,发现配置文件类里的属性也确实正式的配置。很奇怪的问题,难道是缓存
的问题?那就再重启一下服务器,重启完后,再次测试,发下还是不对。难道服务器上的文件和本地的不一致?找到服务器上的推送钉钉
的实现代码,反编译后发现确实是推送的测试地址,怎么会发生这个问题呢?为什么不是访问的地址,而是直接转换成字符串放在这里?
仔细一想,原来是jvm在编译的时候会自动优化,把静态变量转换化成字符串。
常量一种特殊的变量,因为编译器把他们当作值(value)而不是域(field)来对待。如果你的代码中用到了常变量(constant variable),
编译器并不会生成字节码来从对象中载入域的值,而是直接把这个值插入到字节码中。这是一种很有用的优化,但是如果你需要改变final域
的值那么每一块用到那个域的代码都需要重新编译。
问题原因已经找到,把所有的配置文件类都改成正式配置,从新编译后,再次发布问题解决。这种问题以后得注意了。尽量不要使用静态常量,
用属性文件来代替