Spring JPA的实体属性类型转换器并反序列化工具类详解
目录
一、JPA单体JSON与Map的映射创建一个转换类只需在模型类上加个注解就能完成自动转换二、封装反序列化工具类利用JPA的AttributeConverter接口实现属性转换过于局限如何调用自定义的转换器一、JPA 单体JSON与Map的映射
数据库中test字段为json类型
{"key": "颜色", "value": "深白色", "key_id": 1, "value_id": 3}
模型中test字段为Map类型
private Maptest;
问题:如何将数据库字段的值映射到模型中,要用到JPA的属性转换
创建一个转换类
实现AttributeConverter接口
import com.fasterxml.jackson.core.JsonProcessingException; import com.fasterxml.jackson.databind.JsonMappingException; import com.fasterxml.jackson.databind.ObjectMapper; import com.lin.missyou.exception.http.ServerErrorException; import org.springframework.beans.factory.annotation.Autowired; import javax.persistence.AttributeConverter; import javax.persistence.Convert; import javax.persistence.Converter; import java.util.HashMap; import java.util.Map; // 第一个泛型类型就是 entity字段的类型 // json没有类型,对应在JAVA中就是String类型 // 第二个泛型类型就是 数据库字段的类型 @Converter public class MapAndJson implements AttributeConverter
看到接口的方法名,就知道能做什么了。
具体转换需要自己实现,调用SpringBoot提供的Jackson的内置库。
ObjectMapper类是Jackson库的主要类,它提供一些功能将数据集或对象转换的实现。
在类上打上注解@Converter,做为转换类的标识。
只需在模型类上加个注解就能完成自动转换
指明转换类
@Convert(converter = MapAndJson.class) private Maptest;
其他类型转换的操作基本一致,只需要修改类型等局部代码。
二、封装反序列化工具类
数据库中specs字段为json类型
[{"key": "颜色", "value": "深白色", "key_id": 1, "value_id": 3}, {"key": "尺寸", "value": "4.3英寸", "key_id": 2, "value_id": 7}]
模型中specs字段为String类型
建立Spec实体类
@Getter @Setter public class Spec { private Long keyId; private String key; private Long valueId; private String value; }
利用JPA的AttributeConverter接口实现属性转换过于局限
模仿JPA的AttributeConverter接口封装两个方法。
希望转换为实体类的本类型,因为默认将json数据转换为LinkHashMap类型。
通用的转换类,转换为本类。
//反序列化工具类 @Component public class GenericAndJson { private static ObjectMapper mapper; //将ObjectMapper注入到方法里,再通过方法赋值到成员变量上 @Autowired public void setMapper(ObjectMapper mapper) { GenericAndJson.mapper = mapper; } public staticString objectToJson(T o) { try { return GenericAndJson.mapper.writeValueAsString(o); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(99999); } } public static T jsonToObject(String s, TypeReference typeReference) { if (s == null) return null; try { return GenericAndJson.mapper.readValue(s, typeReference); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(9999); } } }
如何调用自定义的转换器
在实体类中,可以通过重写getter、setter方法,自己实现想要转换的数据结构(List),本且能够得到本类(Spec)。
private String specs; public ListgetSpecs() { if (specs == null) return Collections.emptyList(); return GenericAndJson.jsonToObject(this.specs, new TypeReference >() {}); } public void setSpecs(List
specs) { if (specs.isEmpty()) return; this.specs = GenericAndJson.objectToJson(specs); }
以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。
X 关闭
X 关闭
- 15G资费不大降!三大运营商谁提供的5G网速最快?中国信通院给出答案
- 2联想拯救者Y70发布最新预告:售价2970元起 迄今最便宜的骁龙8+旗舰
- 3亚马逊开始大规模推广掌纹支付技术 顾客可使用“挥手付”结账
- 4现代和起亚上半年出口20万辆新能源汽车同比增长30.6%
- 5如何让居民5分钟使用到各种设施?沙特“线性城市”来了
- 6AMD实现连续8个季度的增长 季度营收首次突破60亿美元利润更是翻倍
- 7转转集团发布2022年二季度手机行情报告:二手市场“飘香”
- 8充电宝100Wh等于多少毫安?铁路旅客禁止、限制携带和托运物品目录
- 9好消息!京东与腾讯续签三年战略合作协议 加强技术创新与供应链服务
- 10名创优品拟通过香港IPO全球发售4100万股 全球发售所得款项有什么用处?