一.原因分析:

  1. JacksonTypeHandler在转换JSON字符串为Java对象时,默认使用TypeReference来处理泛型类型。但是,由于Java的类型擦除,运行时无法获取ArrayList<FileUrlDto>的具体泛型类型。
  2. 因此,Jackson在反序列化时,如果没有明确的类型信息,会将JSON数组转换为List<LinkedHashMap>,而不是List<Dto>

二.解决方案

我的失效类型

@TableField(value = "file_list", typeHandler = JacksonTypeHandler.class)
private ArrayList<FileUrlDto> fileList;

自定义类型处理器

import com.baomidou.mybatisplus.extension.handlers.JacksonTypeHandler;
import com.fasterxml.jackson.core.type.TypeReference;
import com.fasterxml.jackson.databind.ObjectMapper;
import java.util.List;
 
public class FileUrlDtoListTypeHandler extends JacksonTypeHandler {
    
    private static final ObjectMapper mapper = new ObjectMapper();
    
    public FileUrlDtoListTypeHandler() {
        // 父类构造函数只接受一个参数
        super(Object.class);
    }
    
    @Override
    protected Object parse(String json) {
        try {
            // 使用 TypeReference 明确指定目标类型为 List<FileUrlDto>
            return mapper.readValue(json, 
                new TypeReference<List<FileUrlDto>>() {});
        } catch (Exception e) {
            throw new RuntimeException("JSON解析失败: " + json, e);
        }
    }
}

修改Dto

@TableField(value = "file_list", typeHandler = FileUrlDtoListTypeHandler.class)
private List<FileUrlDto> fileList;

Logo

腾讯云面向开发者汇聚海量精品云计算使用和开发经验,营造开放的云计算技术生态圈。

更多推荐