1. MySQL5.7下的JSON字段中文乱码问题
中文乱码问题在Java Web开发中经常碰到,大部分原因是后端与前端的编码不一致造成的(如tomcat的默认编码为ISO-8859-1,而前端为GBK),解决办法也简单,只需要加一个CharsetEncodingFilter
就行。但本文要讲的不是这一类总是,而是纯粹的后端问题。
1.1 环境准备
假设MySQL的默认CharSet为UTF-8,应用及部署环境也为UTF-8
- 创建包含JSON字段的数据库表
1 | CREATE TABLE "ipms_device_feature" ( |
- 运行如下脚本查看字段详细信息
1 | show full fields from ipms_device_feature |
结果如下:
上图中
features
这个字段的Collation
列为Null
1 |
|
- 解决办法
第一步:使用MySQL提供的json_unquote方法
1 | json_u features) features ipms_device_feature |
第二步:在Java中调用上面的SQL时,将会返回一个byte
数组,因此只需要通过String
提供的方法进行转码就行。
1 | List<Map> rows = em.createNamedQuery("XXX").list(); |
这样的话,Java变更features
就是正常的中文,就可以直接回传给前端页面了。
2. 几个容易踩的坑
2.1. Integer
对象之间比较的坑
对于Integer var=?
在-128
至127
之间的赋值,Integer
对象是在IntegerCache.cache
产生,会复用已有对象,这个区间内的Integer
值可以直接使用==进行判断,但是这个区间之外的所有数据,都会在堆上产生,并不会复用已有对象。因此建议Integer
对象在比较时应使用equals
方法。
2.2. ArrayList
的subList()
方法返回值的坑
ArrayList
的subList
方法返回的结果不可强转成ArrayList
,否则会抛出ClassCastException
异常:
1 | java.util.RandomAccessSubList cannot be cast to java.util.ArrayList; |
因为subList
方法返回的是ArrayList
的内部类SubList
,并不是ArrayList
,而是ArrayList
的一个视图,对于内部类SubList
的所有操作最终会反映到原列表上。
2.3. Arrays.asList()
方法返回值的坑
使用工具类Arrays.asList()
把数组转换成集合时,不能使用其修改集合相关的方法,它的 add/remove/clear
方法会抛出UnsupportedOperationException
异常。因为asList
方法的返回对象是一个Arrays
内部类,并没有实现集合的修改方法。Arrays.asList
体现的是适配器模式,只是转换接口,后台的数据仍是数组。
1 | String[] str = new String[] { "a", "b" }; |
3. 新版Eclipse Neon运行Junit报NPE
- 问题描述:在Eclipse中创建单元测试用例(项目依赖的版本为junit-4.4)时,报如下错误
1 | java.lang.NullPointerException |
原因分析:新版Eclipse在启动单元测试用例时调用的是JUnit新版本的方法,即Eclipse已不支持junit4.9以下的版本。
解决办法:升级JUnit依赖版本即可
Windows下修改tomcat配置
1 |
|
获取echarts地图中各地区的经纬度信息
1 | echarts.getMap('福州').geoJson.features.forEach(function(item){console.log('"' + item.properties.name + '"' + ": [" + item.properties.cp + "],")}); |
待续…
转载请注明出处:cloudnoter.com