如何將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。

推薦閱讀: