使用MyBatis-Plus的@TableField注解配合JacksonTypeHandler来处理JSON字段的映射时,数据库中存储的JSON数组在查询后没有转换为预期的DTO
·
一.原因分析:
- JacksonTypeHandler在转换JSON字符串为Java对象时,默认使用
TypeReference来处理泛型类型。但是,由于Java的类型擦除,运行时无法获取ArrayList<FileUrlDto>的具体泛型类型。 - 因此,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;
更多推荐
所有评论(0)