当前使用版本
3.5.3.1
问题复现
mysql对应字段为json类型,在Entity里使用自定义json序列化
@TableField(typeHandler = XxxTypeHandler.class)
private List<XXX> list;
使用Jackson序列化,在JacksonTypeHandler里自动读取到的type类型为list,导致反序列化时结果为List<LinkedHashMap>
扩展建议
@TableField注解支持指定一个类型,这样的话在TypeHandler里正确记录泛型里的对象类型,反序列化时就能正常,TypeHandler也可以通用,不必再每个字段都写一个自定义TypeHandler
临时可用的解决方案
在每一个字段上使用一个自定义的TypeHandler,不够“悠亚”
@MappedJdbcTypes({JdbcType.VARCHAR})
public class XxxTypeHandler extends AbstractJsonTypeHandler<List<Xxx>> {
private static ObjectMapper OBJECT_MAPPER;
@Override
protected List<Xxx> parse(String json) {
try {
JavaType javaType = objectMapper().getTypeFactory().constructParametricType(ArrayList.class, Xxx.class);
return objectMapper().readValue(json, javaType);
} catch (IOException var3) {
throw new RuntimeException(var3);
}
}
@Override
protected String toJson(List<Xxx> obj) {
try {
return objectMapper().writeValueAsString(obj);
} catch (JsonProcessingException var3) {
throw new RuntimeException(var3);
}
}
public static ObjectMapper objectMapper() {
if (null == OBJECT_MAPPER) {
OBJECT_MAPPER = new ObjectMapper();
}
return OBJECT_MAPPER;
}
}
Comment From: miemieYaho
typehandler逻辑跟随mybatis,不支持泛型
Comment From: 3d-fey
typehandler逻辑跟随mybatis,不支持泛型
对象中,嵌套 List<XXXX> 可以正常序列化,好像对 JSON 数组支持不好
Comment From: minunit
typehandler逻辑跟随mybatis,不支持泛型
我觉得这个不算理由吧,mybatis不支持泛型,是不是可以单独为泛型Handler单开一个分支去扩展,而不是选择放弃实现。 参考Mybatis-Flex团队,是可以实现的。而且泛型的场景很大程度上会很方便业务开发程序员的工作,是一个常见的场景。