JPA解析json出现转换异常

博客讲述了在两个项目共用数据库时,由于一张表的text字段从String改为Map,导致Jpa和Mybatis报错。错误信息指出Map的key(Integer类型)缺少双引号。为解决此问题,提出了两种方案:一是修改Mybatis项目,将Map的key转为String类型;二是改造Jpa,通过实现AttributeConverter接口自定义转换器。选择了后者,并提供了具体的转换器代码示例。

背景:两个项目共用一个数据库,数据库中一张表的一个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的参数,左边就是你在项目里想用的数据结构,右边就是你在数据库里存储的字段。下面的两个方法说的其实很明确

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值