Spring?JPA的實體屬性類型轉換器并反序列化工具類詳解
一、JPA 單體JSON與Map的映射
數(shù)據(jù)庫中test字段為json類型
{"key": "顏色", "value": "深白色", "key_id": 1, "value_id": 3}
模型中test字段為Map類型
private Map<String,Object> test;
問題:如何將數(shù)據(jù)庫字段的值映射到模型中,要用到JPA的屬性轉換
創(chuàng)建一個轉換類
實現(xiàn)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類型 // 第二個泛型類型就是 數(shù)據(jù)庫字段的類型 @Converter public class MapAndJson implements AttributeConverter<Map<String, Object>, String> { /* ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或對象轉換的實現(xiàn)。 它將使用JsonParser和JsonGenerator實例來實現(xiàn)JSON的實際讀/寫。 */ @Autowired private ObjectMapper mapper; @Override public String convertToDatabaseColumn(Map<String, Object> map) { try { return mapper.writeValueAsString(map); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(99999); } } @Override @SuppressWarnings("unchecked") public Map<String, Object> convertToEntityAttribute(String s) { try { if (s == null) return null; return mapper.readValue(s, HashMap.class); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(9999); } } }
看到接口的方法名,就知道能做什么了。
具體轉換需要自己實現(xiàn),調用SpringBoot提供的Jackson的內置庫。
ObjectMapper類是Jackson庫的主要類,它提供一些功能將數(shù)據(jù)集或對象轉換的實現(xiàn)。
在類上打上注解@Converter,做為轉換類的標識。
只需在模型類上加個注解就能完成自動轉換
指明轉換類
@Convert(converter = MapAndJson.class) private Map<String,Object> test;
其他類型轉換的操作基本一致,只需要修改類型等局部代碼。
二、封裝反序列化工具類
數(shù)據(jù)庫中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接口實現(xiàn)屬性轉換過于局限
模仿JPA的AttributeConverter接口封裝兩個方法。
希望轉換為實體類的本類型,因為默認將json數(shù)據(jù)轉換為LinkHashMap類型。
通用的轉換類,轉換為本類。
//反序列化工具類 @Component public class GenericAndJson { private static ObjectMapper mapper; //將ObjectMapper注入到方法里,再通過方法賦值到成員變量上 @Autowired public void setMapper(ObjectMapper mapper) { GenericAndJson.mapper = mapper; } public static <T> String objectToJson(T o) { try { return GenericAndJson.mapper.writeValueAsString(o); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(99999); } } public static <T> T jsonToObject(String s, TypeReference<T> typeReference) { if (s == null) return null; try { return GenericAndJson.mapper.readValue(s, typeReference); } catch (Exception e) { e.printStackTrace(); throw new ServerErrorException(9999); } } }
如何調用自定義的轉換器
在實體類中,可以通過重寫getter、setter方法,自己實現(xiàn)想要轉換的數(shù)據(jù)結構(List),本且能夠得到本類(Spec)。
private String specs; public List<Spec> getSpecs() { ? ? if (specs == null) return Collections.emptyList(); ? ? return GenericAndJson.jsonToObject(this.specs, new TypeReference<List<Spec>>() {}); } public void setSpecs(List<Spec> specs) { ? ? if (specs.isEmpty()) return; ? ? this.specs = GenericAndJson.objectToJson(specs); }
以上為個人經驗,希望能給大家一個參考,也希望大家多多支持腳本之家。
相關文章
基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式)
這篇文章主要介紹了基于Mybatis實現(xiàn)CRUD操作過程解析(xml方式),文中通過示例代碼介紹的非常詳細,對大家的學習或者工作具有一定的參考學習價值,需要的朋友可以參考下2020-11-11MybatisPlus多數(shù)據(jù)源及事務解決思路
這篇文章主要介紹了MybatisPlus多數(shù)據(jù)源及事務解決思路,本文給大家介紹的非常詳細,對大家的學習或工作具有一定的參考借鑒價值,需要的朋友可以參考下2021-01-01解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析
這篇文章主要介紹了解決定時任務@Scheduled沒有準時執(zhí)行的原因及分析,具有很好的參考價值,希望對大家有所幫助。如有錯誤或未考慮完全的地方,望不吝賜教2023-04-04解讀httpclient的validateAfterInactivity連接池狀態(tài)檢測
這篇文章主要為大家介紹了httpclient的validateAfterInactivity連接池狀態(tài)檢測解讀*,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2023-11-11java動態(tài)代理和cglib動態(tài)代理示例分享
這篇文章主要介紹了java動態(tài)代理和cglib動態(tài)代理示例,JDK1.3之后,Java提供了動態(tài)代理的技術,允許開發(fā)者在運行期間創(chuàng)建接口的代理實例,下面我們使用示例學習一下2014-03-03Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步
這篇文章主要為大家介紹了Spring?Boot整合阿里開源中間件Canal實現(xiàn)數(shù)據(jù)增量同步示例詳解,有需要的朋友可以借鑒參考下,希望能夠有所幫助,祝大家多多進步,早日升職加薪2022-06-06