编程过程中踩过的坑

一、mybatis-plus(2.1.9)与easyexcel(1.1.2-beat1)的冲突

冲突原因

在使用ee的时候,需要继承其基类BaseRowModel,而该基类中含有一个私有属性private Map<Integer,CellStyle> cellStyleMap,所以在使用mp的时候,mp会将该属性视为bean的属性,也即作为数据库字段,虽然mp提供了忽略用的注解@TableField(exist = false),但是我们无法在ee源码中使用该注解,所以mp会将该属性作为查询元素进行selectinsertupdate,而数据库并不存在该字段,所以将会出现异常。

解决方案
1. 改造库表

鉴于异常原因是数据库不存在该字段,则我们可以在数据库中加入该字段,并且在insertupdate的时候设置该字段为null,即可解决该问题。

该方案弊端在于需要在所有继承BaseRowModel类的表都添加字段,且需要在所有insertupdate的地方设置该字段,麻烦且容易遗忘。当然可以重写构造函数,需要在显示地声明无参构造器之外再声明设置该属性为null的有参构造器。

2. 重写源代码(未尝试)

冲突原因里还说了一点,我们不可以在ee的源码中使用@TableField(exist = false)注解,那么,如果我们重写了ee的源码,就可以使用该注解。

因为未尝试该方案,故不清楚在导入导出的过程中是否会出现问题。

二、DateLocalDateTime的选择问题

LocalDateTime是Java8中新推出的日期时间类,某些代码生成工具会将数据库中的时间字段生成为该类型。

该类型在使用时,通常在json化时不存在问题,但在反json化时某些json工具类库可能出现类型转换错误,无法反json化为该类型。已知的可能出现问题类库包括gson、jackson、hutool,阿里的fastjson暂时没有测试。

另外,在Spring的配置文件中,spring:jackson:date-format:可以全局配置日期格式,但对LocalDateTime会失效(因为时间过去比较久了,记得不是很清楚,读者可以自行验证一下,如果此处错误,请告知)。

所以,在目前情况下,大多数主流的框架和类库还没有完美适配LocalDateTime,个人建议还是使用Date类型。

三、与时间相关的数值应当适当地使用Long或者long类型!

有时候我们在设置一些和时间相关的量时,比如登录有效期,如果单位是秒或者毫秒,一定要使用长整型,也许目前所设置的量远远达不到整型上限,但稍微改动变可能接近。而且Java里很多地方需要使用毫秒级,此时在放大一千倍以后,极有可能溢出。

所以,除非是一开始就知道一定是远远小于整型上限,且不会改动领导的嘴,骗人的鬼的值,否则应当考虑使用长整型。

四、关于lombok的@accessors注解

在使用这个注解的时候千万千万不要设置@accessors(fluent = true)!!!
在使用了这个设置以后,原本的getter/setter方法会去掉get/set前缀,直接由字段名表示。但是,很多框架和库在注入和取值的时候依然会去寻找带有前缀的getter/setter方法,这会导致找不到相应方法,无法完成取值和注入。

这个问题导致我在使用RestTemplate.postForObject(...)方法时,无法在请求接收端正确地取值,并且在对实体进行json化的时候也会超出预期。

五、在做登录时最好做好多点登录准备

项目初期可能只需要一个简单的登录功能,但到中后期可能需要实现多点同时登录的情况,此时若有多点登录准备,则扩展起来更容易

六、关于微信网页授权接口的问题

  1. 若从该接口返回给用户一个thymeleaf渲染的视图,则视图中使用的css和js的相对路径并非templates与static之间的相对路径。由于视图的来源于controller层,所以浏览器会将centroller接口的路径视为视图路径,所以静态文件在使用相对路径时,也必须视为从controller层开始。

如:host/context-path/templates/index.html,host/context-path/static/js/vue.js,host/context-path/wechat/redirect/{appid}/index
在index.html文件中似乎应该写…/static/js/vue.js,但实际上是取不到该js文件的,正确的路径是…/…/…/static/js/vue.js。否则浏览器的请求路径是host/context-path/wechat/redirect/static/js/vue.js。

  1. 在上述的index.html页面中会出现跨域问题(真实场景为:在该页面刷新图片验证码与提交数据时),导致服务器产生不同的session,一般在ajax中加入xhrFields: {withCredentials: true}即可,但有时仍然会出现,目前尚不清楚原因,也不清楚解决方案。

七、后端在将数据json化的过程不要对空的数据使用空字符串

除String类型外,如果将空数据使用空字符串表示,则无法将json数据反json化为对象。

八、WxJava无法使用代理上网

由于服务器不具备外网访问权限,所以需要通过代理上网,虽然做了全局代理设置,但使用WxMpService仍然无法上网。
在其github页面的HttpClient相关参数的设置方法中有相关教程,但我并未看懂,希望有懂的大神指点一二。

九、Cannot find module 'core-js/library/fn/object/assign'

在用vuepress中使用ElementUI时,时钟无法成功加载插件,一直提示Cannot find module 'core-js/library/fn/object/assign'。网上找了很多方法,包括删除node_modules目录再重新安装,和用cnpm命令重新安装,始终缺少文件,最后从别的项目拷贝了library目录过来才解决

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值