文章目录
- 一、mybatis-plus(2.1.9)与easyexcel(1.1.2-beat1)的冲突
- 二、`Date`与`LocalDateTime`的选择问题
- 三、与时间相关的数值应当适当地使用`Long`或者`long`类型!
- 四、关于lombok的`@accessors`注解
- 五、在做登录时最好做好多点登录准备
- 六、关于微信网页授权接口的问题
- 七、后端在将数据json化的过程不要对空的数据使用空字符串
- 八、[WxJava](https://www.oschina.net/p/weixin-java-tools-new)无法使用代理上网
- 九、`Cannot find module 'core-js/library/fn/object/assign'`
一、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会将该属性作为查询元素进行select
、insert
、update
,而数据库并不存在该字段,所以将会出现异常。
解决方案
1. 改造库表
鉴于异常原因是数据库不存在该字段,则我们可以在数据库中加入该字段,并且在insert
、update
的时候设置该字段为null
,即可解决该问题。
该方案弊端在于需要在所有继承BaseRowModel
类的表都添加字段,且需要在所有insert
、update
的地方设置该字段,麻烦且容易遗忘。当然可以重写构造函数,需要在显示地声明无参构造器之外再声明设置该属性为null
的有参构造器。
2. 重写源代码(未尝试)
冲突原因里还说了一点,我们不可以在ee的源码中使用@TableField(exist = false)
注解,那么,如果我们重写了ee的源码,就可以使用该注解。
因为未尝试该方案,故不清楚在导入导出的过程中是否会出现问题。
二、Date
与LocalDateTime
的选择问题
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化的时候也会超出预期。
五、在做登录时最好做好多点登录准备
项目初期可能只需要一个简单的登录功能,但到中后期可能需要实现多点同时登录的情况,此时若有多点登录准备,则扩展起来更容易
六、关于微信网页授权接口的问题
- 若从该接口返回给用户一个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。
- 在上述的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目录过来才解决