如何将Object类转换为实体类

 更新时间:2022年08月18日 16:45:54   作者:王星星的魔灯  
这篇文章主要介绍了如何将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;
    }

以上为个人经验,希望能给大家一个参考,也希望大家多多支持脚本之家。

相关文章

  • java输入多个数据(不确定),排序,并求最大值的方法

    java输入多个数据(不确定),排序,并求最大值的方法

    今天小编就为大家分享一篇java输入多个数据(不确定),排序,并求最大值的方法,具有很好的参考价值,希望对大家有所帮助。一起跟随小编过来看看吧
    2018-07-07
  • springboot整合knife4j全过程

    springboot整合knife4j全过程

    这篇文章主要介绍了springboot整合knife4j全过程,具有很好的参考价值,希望对大家有所帮助,如有错误或未考虑完全的地方,望不吝赐教
    2023-12-12
  • 分隔List集合,按指定大小,将集合分成多个的方法

    分隔List集合,按指定大小,将集合分成多个的方法

    下面小编就为大家带来一篇分隔List集合,按指定大小,将集合分成多个的方法。小编觉得挺不错的,现在就分享给大家,也给大家做个参考。一起跟随小编过来看看吧
    2017-03-03
  • SpringCloud FeignClient 超时设置

    SpringCloud FeignClient 超时设置

    FeignClient 默认的超时时间可能不满足你的需求,你可以通过几种方式来自定义这些超时设置,具有一定的参考价值,感兴趣的可以了解一下
    2024-08-08
  • Springboot多环境开发及使用方法

    Springboot多环境开发及使用方法

    这篇文章主要介绍了Springboot多环境开发及多环境设置使用、多环境分组管理的相关知识,本文给大家介绍的非常详细,对大家的学习或工作具有一定的参考借鉴价值,需要的朋友可以参考下
    2022-03-03
  • Springboot如何通过filter修改Header的值

    Springboot如何通过filter修改Header的值

    这篇文章主要介绍了Springboot如何通过filter修改Header的值问题,具有很好的参考价值,希望对大家有所帮助。如有错误或未考虑完全的地方,望不吝赐教
    2023-07-07
  • Java中transient关键字的详细总结

    Java中transient关键字的详细总结

    本文要介绍的是Java中的transient关键字,transient是短暂的意思。对于transient 修饰的成员变量,在类的实例对象的序列化处理过程中会被忽略,感兴趣的朋友可以参考阅读
    2023-04-04
  • Java操作excel的三种常见方法实例

    Java操作excel的三种常见方法实例

    这篇文章主要给大家介绍了关于Java操作excel的三种常见方法,文中通过示例代码介绍的非常详细,对大家的学习或者工作具有一定的参考学习价值,需要的朋友们下面随着小编来一起学习学习吧
    2021-04-04
  • 深入探索Java常量池

    深入探索Java常量池

    这篇文章主要介绍了深入探索Java常量池,涉及静态常量池和运行时常量池的介绍,常量池的好处,8种基本数据类型的包装类和常量池等相关内容,具有一定参考价值,需要的朋友可以了解下。
    2017-11-11
  • 浅谈javap命令拆解字节码文件

    浅谈javap命令拆解字节码文件

    这篇文章主要介绍了拆解字节码文件javap命令,对反编译感兴趣的同学可以参考下
    2021-04-04

最新评论