如何將Object類轉換為實體類
將Object類轉換為實體類
問題描述
在用SpringBoot寫controller的時候,需要接受一個map的Object,之後要把Object轉為特定的類,代碼如下:
public boolean postArticle(@RequestBody Map<String, Object> map) { ArticleInfo articleInfo = (ArticleInfo) map.get("articleInfo"); ArticleContent articleContent = (ArticleContent) map.get("articleContent"); System.out.println(articleInfo + " " + articleContent); return true; }
之後爆出異常:
java.lang.ClassCastException: class java.util.LinkedHashMap cannot be cast to class
cn.zi10ng.blog.domain.ArticleInfo (java.util.LinkedHashMap is in module java.base of loader
'bootstrap'; cn.zi10ng.blog.domain.ArticleInfo is in unnamed module of loader
org.springframework.boot.devtools.restart.classloader.RestartClassLoader @19b54dc3)
問題原因
map中取出的是Object,不能直接把Object轉為特定的實體類
解決辦法
需要通過json來作為中間介質:
public boolean postArticle(@RequestBody Map<String, Object> map) throws IOException { ObjectMapper objectMapper = new ObjectMapper(); String jsonInfo = objectMapper.writeValueAsString(map.get("articleInfo")); String jsonContent = objectMapper.writeValueAsString(map.get("articleContent")); ArticleInfo articleInfo = objectMapper.readValue(jsonInfo,ArticleInfo.class); ArticleContent articleContent = objectMapper.readValue(jsonContent,ArticleContent.class); System.out.println(articleContent + " " +articleInfo); return articleService.insertArticle(articleInfo,articleContent); }
實體類之間的相互轉換
public static <A, B> B beanA2beanB(A beanA, Class<B> bClass, String... ignoreProperties) { try { B b = bClass.newInstance(); cn.hutool.core.bean.BeanUtil.copyProperties( beanA, b, CopyOptions.create().setIgnoreProperties(ignoreProperties).ignoreError().ignoreNullValue() ); return b; } catch (Exception e) { e.printStackTrace(); } return (B) new Object(); } /** * 可實現由 BeanA List 轉換為 BeanB List<br> * tip1: 轉換的規則是 實體內屬性一致的進行轉換<br> * tip2: 轉換會忽略 Null 和錯誤 * * @param listA A 實體 * @param bClass B 類 * @param ignoreProperties 要忽略轉換的字段 數組類型<br> * 由該屬性可解決同一個Vo 在不同需求中要返回的實體不一致問題 列入UserListVO 在後臺和前臺使用的列表是同一個,但是返回的字段不一致 * @param <A> 泛型A * @param <B> 泛型 * @return 轉換後的BList實體 */ public static <A, B> List<B> listA2ListB(Collection<A> listA, Class<B> bClass, String... ignoreProperties) { List<B> listB = new ArrayList<>(); if (ObjectUtils.isEmpty(listA)) { return listB; } try { for (A a : listA) { listB.add(beanA2beanB(a, bClass, ignoreProperties)); } } catch (Exception e) { e.printStackTrace(); } return listB; }
以上為個人經驗,希望能給大傢一個參考,也希望大傢多多支持WalkonNet。
推薦閱讀:
- 淺入淺出的講解Spring循環依賴問題
- Java找出兩個大數據量List集合中的不同元素的方法總結
- 大數組元素差異removeAll與Map效率對比
- 一篇文章帶你瞭解Java泛型的super和extends
- 深度解析SpringBoot中@Async引起的循環依賴