当前使用版本(必填,否则不予处理)
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。
通过在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 可以解决?