当前使用版本

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团队,是可以实现的。而且泛型的场景很大程度上会很方便业务开发程序员的工作,是一个常见的场景。