1. org.hibernate.lazyInitializationException(懒加载异常)
user表中存储部门,存的是部门id,然后通过many to one关联。用的时候直接获取到用户,再获取部门就可以获取到这个部门里面的所有数据了。但是,如果是springsecurity中获取的user对象,只可以获取部门的id,去获取其他数据就会报错。
以前有同事说获取到的不全,所以说根据id再去数据库查一遍。真正的原因是,many to one开启了懒加载,我们在对应的字段上设置lazy = false即可。加两个参数 lazy = false和fetch=join,这样可以获取到了。fetch策略用于定义 get/load一个对象时,如何获取非lazy的对象/集合。
2. public Set keySet()
返回此映射中所包含的键的 set 视图。该集合受映射的支持,所以映射的变化也反映在该集合中,反之亦然。该集合支持元素的移除,通过 Iterator.remove、Set.remove、removeAll、retainAll 和 clear 操作,从该映射中移除相应的映射关系,注意:必须使用迭代器。它不支持 add 或 addAll 操作。 (低端错误但总犯)
3. 下载文件报错“:org.apache.catalina.connector.ClientAbortException: java.io.IOException: 远程主机强迫关闭了一个现有的连接。
我这次的原因是:文件名包含英文逗号。
解决: 文件名加上引号。
response.setHeader("Content-Disposition", "attachment; filename=\"" + new String(dpsResource.getFilename().getBytes(),"ISO8859-1")+"\"");
这个非常关键,我看公司的项目里面都没有加这个引号,这也就意意味着用户只要上传带英文逗号的文件就无法下载,还有;后面的文件名无法展示。这其实算是一个很严重的bug,虽然平时不怎么可能出现,但是一旦出现,解决起来会很吃力。
我的历程:一开始测试说下载不了视频,于是我就从bilibili下载视频去测试,一测试我也下载不了。然后我觉得可能是文件太大,又找了更小的视频,还是下载不了。这时候,我把视频压缩了一下,整成压缩包上传然后下载,也不行,其实这时候我有机会直接解决问题的。视频和压缩包都不行,说明了什么?是文件格式的问题吗?是大小的问题吗?都不是。是这两个文件拥有相同的名字!但是当时的我并没有想到这一步,这是一个巨大的失误,是思维方式的问题。
然后最坑的一步来了,我使用postman测试,虽然没有文件名但是可以下载过来,到这一步我已经麻了,一万个问号。开始联系前端,找问题为什么调不通。一顿操作下来他也说不清,后来他说你发我你的文件吧,我从b站下的退钱哥世界杯的视频,他说一看这个视频的名字,得先看了再找原因。他一说名字,这时候我恍然大悟,对!名字!!接下来就很轻松了,换成一个没有特殊符号的名字,成功。接下来对文件名里面的特殊符号一顿测试,最终定位到了英文逗号,以及英文分号。
之后解决就是百度一下的事了,很蠢,两个引号花了我一下午。但是现在想想,没有这么巧的话,我可能永远也掌握不了这个知识点。之后想利用这个bug做一点奇怪的事情,没有成功(我想用文件名注入一些代码进去)
TODO:还有一个问题没有解决,为什么postman可以下载?
4. mysql,sum()出现精度丢失
例如double类型,0.1+0.1+0.1=0.3,结果sum后变为了0.30000000000000004
一开始我遇到这都是整到java里面,后来通过一个朋友知道mysql也有decimal,使用cast函数转换一下也行,在mysql处理也是一种办法。
补充:CAST函数用于将值从一种数据类型转换为表达式中指定的另一种数据类型,cast(value AS dataType)
5. SpringContextHolder
SpringContextHolder 可以方便地引用各种 bean 而不需要注入,想在哪用就在哪用。
6. Java Properties 类
Properties 继承于 Hashtable。表示一个持久的属性集.属性列表中每个键及其对应值都是一个字符串。
骚操作来了:
获取到类加载器,使用类加载器调getResourceAsStream(),获取InputStream。然后直接调用load(),把InputStream放进去。就获取到了对应关系,用这个来加载一些属性很好用。
void load(InputStream streamIn) throws IOException
7. 多线程@AutoWired注入NPE
在多线程时使用@Autowired总是获取不到bean,原因是:new thread不在spring容器中,也就无法获得spring中的bean对象。
在线程中为了线程安全,是防注入的,如果要用到这个类,只能从bean工厂里拿个实例。
8. mysql orderby汉字
巨坑,导致你想要的结果出不来,进到项目里一看order by 汉字了。