大家好,我是阿凡,最近在做一个前后台分离的项目,每天都要和测试拼,除了前端。今天阿粉就带大家来了解一下自己最近在项目中遇到的一个坑。需求前端使用富文本插件Ueditor,插件初始化时需要从后端获取config配置。入坑经验先看初始代码:@RequestMapping(value="/getConfig")publicObjectgetConfig(HttpServletRequestrequest){returnreadConfig();}/***读取配置文件*@return*/privateUedConfigreadConfig(){Stringpath=this.getClass().getResource("/").getPath();FileInputStreamfileInputStream=newFileInputStream(path+"config/ued_config.json");//读出来,转成对象返回...}的代码大概是这样的,然后启动后,前端告诉我没有获取到任何信息。Nani,我的postman自测没问题,有返回数据。然后阿芬跑到前端问有没有错误?前端说是跨域。阿芬当时不乐意了,立马ctrl+c加ctrl+v把处理跨域请求的后端配置发给了前端。然后前端告诉我jsonp请求是跨域的。阿芬一脸懵逼???jsonp跨域?从来没有听说过。立马去找度娘,果然一搜全是解决办法。因为是springboot项目,找了个最简单的。看代码:@ControllerAdvicepublicclassJsonpAdviceextendsAbstractJsonpResponseBodyAdvice{publicJsonpAdvice(){super("callback");}}看,是不是很简单。如果AbstractJsonpResponseBodyAdvice这个词下面没有红线就完美了。没介绍班级?为什么这么难得倒阿粉。alt+enter,咦,什么情况,没有这个类?不可能的。马上问度娘,原来这个类只有springboot2.0以下才有。所以我该怎么做?2.0及以上好像没有办法处理jsonp跨域。阿粉又在百度上搜索了一下,果然天不遂人愿。阿芬看到jackson里面有个JSONPObject类可以处理,于是阿芬改了代码:@RequestMapping(value="/getConfig")publicObjectgetConfig(Stringcallback,HttpServletRequestrequest){returnnewJSONPObject(callback,readConfig());}然后重启,自检没问题。让前端试一下,可以正常获取。好的,完美。项目完成后,前后端也打通了,送到测试环境,供测试人员测试。Duang~Abug丢到阿凡头上,配置失败。不可能,肯定是前端的问题,于是跑到前端让前端看。看完前端给了我一句话,测试环境不跨域。一瞬间,万草尼玛斯从他们头顶飘了过来。阿芬辛苦了几个小时才解决了跨域问题。你跟我说测试环境不是跨域的。哎,没办法,我只能含着泪抗拒这一锅。然后阿芬又改了代码:@RequestMapping(value="/getConfig")publicObjectgetConfig(Stringcallback,HttpServletRequestrequest){returnStringUtils.isEmpty(callback)?readConfig():newJSONPObject(callback,readConfig());}还是做了兼容性,因为前端还需要连接我进行本地调试。不过这次应该没问题了,阿芬还是有些得意的。提交代码,发送测试,搞定。Duang~同样的虫子又被扔到了阿芬的脸上。我的心凉了,怎么回事?日志没有报错。折腾了半天,不知道为什么,阿芬只能加日志,因为在测试环境下不好调试,也没报错。然后让运维配合,然后发现this.getClass().getResource("/").getPath()获取的路径是错误的。阿凡再次一脸懵逼。这不是项目的根路径吗?这是怎么回事?呢绒布。然后阿芬又厚着脸皮去找度娘,果然第一时间就找到了原因,因为springboot集成了tomcat,项目直接打包成jar包运行,不能通过this.getClass().getResource("/").getPath()这个获取项目根路径的方法只能通过stream方法获取,然后阿粉又改了代码:/***读取配置文件*@return*/privateUedConfigreadConfig(){InputStreamresourceAsStream=this.getClass().getResourceAsStream("/"+"config/ued_config.json");//读出来,变成对象返回...}这次提交后终于OK了。解决了bug,阿芬很开心。总结经常看到一些小伙伴说本地连接没问题,但是为什么测试环境bug那么多。阿芬总结的要点如下:制度不同。本地系统一般是window系统,而测试和线上系统一般是linux系统。运行模式不同。本地的springboot项目是通过代码工具(idea)启动的,而测试和线上是通过jar包启动的。比如其他jar引入的一些问题。..好了,阿芬这次的分享就到这里。希望看过阿芬文章的朋友少走弯路。觉得有用记得点个赞哦。
