- A+
背景:mysql中的一个字段类型为json,使用mybatis-plus,entity中该字段定义为List<CusDTO> extra,并指定了注解
@TableField(typeHandler = JacksonTypeHandler.class)
数据插入进去是没问题的,但是取出来时,循环处理时,报错java.util.LinkedHashMap cannot be cast to CusDTO
研究了下,发现JacksonTypeHandler只能用于单个对象的json序列化,而List类型的,由于它并不知道具体的泛型是哪个,所以就当做Map来处理了,所以循环时才会报类型转换的错。
解决方法是自定义一个TypeHandler,里面明确指定泛型,并使用jaskon中列表的序列化方式。代码如下:
@MappedTypes({List.class})
@MappedJdbcTypes(JdbcType.VARCHAR)
public class ListJacksonTypeHandler extends AbstractJsonTypeHandler<List> {
private final ObjectMapper objectMapper;
private final CollectionType collectionType;
public ListBalanceAcctJacksonTypeHandler() {
this.objectMapper = JacksonUtil.getBuilder().build();
this.collectionType = this.objectMapper.getTypeFactory()
.constructCollectionType(ArrayList.class, CusDTO.class);
}
@Override
protected List parse(String json) {
try {
return objectMapper.readValue(json, collectionType);
} catch (IOException e) {
throw new RuntimeException(e);
}
}
@Override
protected String toJson(List obj) {
try {
return objectMapper.writeValueAsString(obj);
} catch (JsonProcessingException e) {
throw new RuntimeException(e);
}
}
}
