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

3.5.2

该问题是如何引起的?(确定最新版也有问题再提!!!)

我的一个实体类中有以下两个成员变量

@TableField(typeHandler = TestJsonTypeHandler.class)
private List<Test> test;

@TableField(typeHandler = SolutionJsonTypeHandler.class)
private List<Solution> solution;

它们两个在数据库中都是以JSON数组的形式储存的 [{},{}] 我为它们两个分别编写了TypeHandle

@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class, Solution.class})
public class SolutionJsonTypeHandler extends AbstractJsonTypeHandler<List<Solution>> {
    @Override
    protected List<Solution> parseJsonString(String jsonString) {
        System.out.println("Parsing Solution JSON: " + jsonString);
        return JSON.parseArray(jsonString, Solution.class);
    }
}
@MappedJdbcTypes(JdbcType.VARCHAR)
@MappedTypes({List.class, Test.class})
public class TestJsonTypeHandler extends AbstractJsonTypeHandler<List<Test>> {
    @Override
    protected List<Test> parseJsonString(String jsonString) {
        System.out.println("Parsing Test JSON: " + jsonString);
        return JSON.parseArray(jsonString, Test.class);
    }
}

然后注册之后,运行测试程序。调试发现这两个字段都是走了SolutionJsonTypeHandler。 MyBatis-Plus 当实体类中成员变量类型中存在泛型时,TypeHandler将无法正确地被指定 通过在handler里打断点也可以证实这点。

我推测十有八九是因为List的泛型被擦除了,Mybatis认为这两个变量是同一种类型。所以我想通过@TableField(typeHandler = SolutionJsonTypeHandler.class)明确指定handler来解决这个问题。(我原本推测这个属性就是为了解决这个问题而定的) 但是如上图所示还是不行。

包括对@MappedTypes进行编辑,各种尝试之后依旧找不到解决方案。 最终妥协,把List换成了数组,就能正确指定handler了。

不知道这个问题是否可以更优雅的解决(我真的很喜欢List)。整体看下来@TableField(typeHandler = SolutionJsonTypeHandler.class)是没有起任何作用的。

Comment From: miemieYaho

mybatis就是这样的

Comment From: Kagenui-yozuru

mybatis就是这样的

那么@TableField(typeHandler = SolutionJsonTypeHandler.class) 的应用场景是什么呀。默认情况下如果可以通过类型推断则不需要它,不能通过类型推断的时候又不能生效……

Comment From: tangguochang

貌似mybatis在xml中指定 typeHandler 可以解决?