当前使用版本(必填,否则不予处理)
3.4.0
该问题是如何引起的?(确定最新版也有问题再提!!!)
使用了多个typeHandler,其余的都是正常,就是单独这一个在查询时有时候出现null,有时候又正常显示,出现null结果概率为60%,现在靠重启刷正常的情况
数据库情况: 数据库使用的是sqlite,字段类型是text java实体类数据类型为List
字段定义:
(出现问题字段) @TableField(typeHandler = KeywordTypeHandler.class) private List keywords;
(正常字段) @TableField(typeHandler = BoundTypeHandler.class) private BoundingBox bounds;
get/set方法是快捷方式定义出来,没有更改或增加任何代码
BoundingBox 是自己定义的一个简单类
typeHandler定义:
@MappedJdbcTypes(JdbcType.VARCHAR) //数据库类型
@MappedTypes({List.class}) //java数据类型
public class KeywordTypeHandler implements TypeHandler<List> {
@Override
public void setParameter(PreparedStatement ps, int i, List parameter, JdbcType jdbcType) throws SQLException {
String value = String.valueOf(parameter.get(0));
ArrayList<String> objects = new ArrayList<>();
String[] split = value.split(",");
for (String s : split) {
String replace = s.replace("[", "").replace("]", "");
objects.add(replace);
}
ps.setString(i, JSON.stringify(objects));
}
@Override
public List getResult(ResultSet rs, String columnName) throws SQLException {
String string = rs.getString(columnName);
if ("[]".equals(string)) {
return new ArrayList();
}
return JSON.parseArray(string);
}
@Override
public List getResult(ResultSet rs, int columnIndex) throws SQLException {
String string = rs.getString(columnIndex);
if ("[]".equals(string)) {
return new ArrayList();
}
return JSON.parseArray(string);
}
@Override
public List getResult(CallableStatement cs, int columnIndex) throws SQLException {
String string = cs.getString(columnIndex);
if ("[]".equals(string)) {
return new ArrayList();
}
return JSON.parseArray(string);
}
}
MappedJdbcTypes(JdbcType.VARCHAR) //数据库类型
@MappedTypes({BoundingBox.class}) //java数据类型
public class BoundTypeHandler implements TypeHandler<BoundingBox> {
@Override
public void setParameter(PreparedStatement ps, int i, BoundingBox parameter, JdbcType jdbcType) throws SQLException {
ps.setString(i,parameter.toString());
}
@Override
public BoundingBox getResult(ResultSet rs, String columnName) throws SQLException {
String[] split = rs.getString(columnName).split(",");
ArrayList<Double> list = new ArrayList<Double>();
for (String s : split) {
Double value = Double.valueOf(s);
list.add(value);
}
return new BoundingBox(list.get(0), list.get(1), list.get(2), list.get(3));
}
@Override
public BoundingBox getResult(ResultSet rs, int columnIndex) throws SQLException {
String[] split = rs.getString(columnIndex).split(",");
ArrayList<Double> list = new ArrayList<Double>();
for (String s : split) {
Double value = Double.valueOf(s);
list.add(value);
}
return new BoundingBox(list.get(0), list.get(1), list.get(2), list.get(3));
}
@Override
public BoundingBox getResult(CallableStatement cs, int columnIndex) throws SQLException {
String[] split = cs.getString(columnIndex).split(",");
ArrayList<Double> list = new ArrayList<Double>();
for (String s : split) {
Double value = Double.valueOf(s);
list.add(value);
}
return new BoundingBox(list.get(0), list.get(1), list.get(2), list.get(3));
}
}
重现步骤(如果有就写完整)
正常情况 "keywords": [1,2,3], "bounds": { "minX": -90.0, "minY": -180.0, "maxX": 90.0, "maxY": 180.0, "null": false, "height": 360.0, "width": 180.0, "area": 64800.0 }
错误情况: "keywords":null, "bounds": { "minX": -90.0, "minY": -180.0, "maxX": 90.0, "maxY": 180.0, "null": false, "height": 360.0, "width": 180.0, "area": 64800.0 }
报错信息
无任何报错,null出现概率为60%,用断点调试BoundTypeHandler 的getResult(ResultSet rs, String columnName) 方法100%进入,而getResult(ResultSet rs, String columnName) 方法也就是正常才进入,不进入就是null。重启后,只要为null,永远都是null,只要正常,全部正常。不知道为啥有时能启动正常,有时启动不正常。
Comment From: miemieYaho
我们没办法重现你的玄学
Comment From: yudi941210
我们没办法重现你的玄学
哈哈哈
Comment From: Kenhooo
请问这个问题解决了吗?我现在也遇到一模一样的玄学bug,多个字段同时用到了typehandler,在resultMap中进行字段映射时,只要涉及到typehandler的字段为空,跟在后面的其他typehandler映射出来的字段全部是null,把这个字段内容为空的映射字段调整到resultMap的末尾,其他字段映射为空的问题就解决了