编程过程中踩过的坑

文章目录

      • 一、mybatis-plus(2.1.9)与easyexcel(1.1.2-beat1)的冲突
        • 冲突原因
        • 解决方案
          • 1. 改造库表
          • 2. 重写源代码(未尝试)
      • 二、`Date`与`LocalDateTime`的选择问题
      • 三、与时间相关的数值应当适当地使用`Long`或者`long`类型!
      • 四、关于lombok的`@accessors`注解
      • 五、在做登录时最好做好多点登录准备
      • 六、关于微信网页授权接口的问题
      • 七、后端在将数据json化的过程不要对空的数据使用空字符串
      • 八、[WxJava](https://www.oschina.net/p/weixin-java-tools-new)无法使用代理上网

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

冲突原因

在使用ee的时候,需要继承其基类BaseRowModel,而该基类中含有一个私有属性private Map 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相关参数的设置方法中有相关教程,但我并未看懂,希望有懂的大神指点一二。

你可能感兴趣的:(杂谈)