linux服务器Gson转换抛出Caused by: java.text.ParseException: Unparseable date异常问题最快解决
1. 问题发生 前几天在一台客户给的linux服务器上部署一个后端jar服务时,忽然抛出了这个Caused by: java.text.ParseException: Unparseable date异常。排查代码后来发现,是我们调用用户中心接口时,拿到数据后,用gson进行了对象转换,并从日志里看到是日期转换时抛的错误。2. 问题分析 因为在我们本地开发的时候,没有发生这个问题,所以当时
1. 问题发生
前几天在一台客户给的linux
服务器上部署一个后端jar
服务时,忽然抛出了这个Caused by: java.text.ParseException: Unparseable date
异常。排查代码后来发现,是我们调用用户中心接口时,拿到数据后,用gson
进行了对象转换,并从日志里看到是日期转换时抛的错误。
2. 问题分析
因为在我们本地开发的时候,没有发生这个问题,所以当时也没有想到对Gson
对象设置日期格式。但是部署到linux
服务器报出这个错误,因为是微服务项目,还是挺多服务的,一个个的加太麻烦,而且,我优先想到的,也是服务器系统问题,而不是代码问题,代码能有什么问题???。
基于这样的疑惑,然后跟运维大佬一番打听,因为是客户新给的服务器,我还是挺怀疑他们服务器里的默认设置,比如linux
服务器的时期格式、时区、编码等是否正常。
最后果然发现了点不一样的。
3. 问题解决
在linux
服务器输入locale
命令时,发现如下图所示情况:
这说明当前服务器是英文格式编码,反正其他地方都正常,就这里不对,先改了它再说,感觉也就是它的问题了。然后在linux
服务器上做了如下操作:
输入cd ~
或者就只输入cd
,回到家目录下(有的不是root目录) ,依次执行以下命令。
echo 'export LANG=zh_CN.UTF-8' >> .bash_profile
echo 'export LC_ALL="zh_CN.UTF-8"' >> .bash_profile
以上命令依次执行,然后再输入locale
发现已经变成了下边这样
因为我不懂运维,运维建议是要写入到linux的配置文件里,这样防止有的服务器在重连后,又变回去的问题。
最后重启服务,再试,发现gson
转换正常。
4. 事后思考
虽然最正确的方式,可能大部分人觉得是在书写时应该定义好时间格式,比如这样:
Gson gson= new GsonBuilder().setDateFormat("yyyy-MM-dd HH:mm:ss").create();
但是这样写,我记得是,貌似gson
就只认识这种格式的时间了。当然接口一般也不会变格式,这样写没错。
最后我才想到,因为英文编码下不是我们国家这样定义时间,什么yyyy-MM-dd
,人家都这样写:
因为我们接口里是中文编码下的写法,所以,为什么需要改成zh_CN.UTF-8
编码了。
说了这么一大堆,其实就只需要服务器上执行下那两行命令即可。
更多推荐
所有评论(0)