背景:两个项目共用一个数据库,数据库中一张表的一个text字段由String改为Map,Map的key是Integer类型的,一个项目是Mybatis,一个是Jpa。
报错如下:com.fasterxml.jackson.core.JsonParseException: Unexpected character (‘0’ (code 48)): was expecting double-quote to start field name
at [Source: (String)"{0:“null”,20:“null”}"; line: 1, column: 3]›
报错说的很明显,就是0缺少双引号,要么改mybatis的项目,map的key由Integer改为String,插入都带双引号。但是明显改动很大,而且这种改也没啥好说的。另一种就是改Jpa了,我也是改动Jpa。添加一个转换器。

import javax.persistence.Convert;
TemplateNewAttributeConverter就是自己写的了。
public class TemplateNewAttributeConverter implements AttributeConverter<Map<Integer, String>, String> {
@Override
public String convertToDatabaseColumn(Map<Integer, String> attribute) {
return JsonUtil.of(attribute);
}
@Override
public Map<Integer, String> convertToEntityAttribute(String dbData) {
return JsonUtil.ofMap(dbData, Integer.class, String.class);
}
}
其中AttributeConverter的参数,左边就是你在项目里想用的数据结构,右边就是你在数据库里存储的字段。下面的两个方法说的其实很明确
博客讲述了在两个项目共用数据库时,由于一张表的text字段从String改为Map,导致Jpa和Mybatis报错。错误信息指出Map的key(Integer类型)缺少双引号。为解决此问题,提出了两种方案:一是修改Mybatis项目,将Map的key转为String类型;二是改造Jpa,通过实现AttributeConverter接口自定义转换器。选择了后者,并提供了具体的转换器代码示例。

39

被折叠的 条评论
为什么被折叠?



