当前使用版本(必填,否则不予处理)

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的末尾,其他字段映射为空的问题就解决了