MapStruct Map 转换成对象_灵颖桥人的博客-程序员宝宝

技术标签: Java  JavaBean  MapStruct  map  

背景

          调用公司影像识别服务接口,返回值都是 Map<String,Object>类型,有的key很多。想把这种 map 结果转为项目中对应的JavaBean如DTO 或者 VO,又不想写很多的 dto.setXxx(map.get("xxx")) 的代码。(注:可以使用fastjson等工具序列化Map,再反序列化为DTO类;本文只关注 MapStruct)

结果

           查阅测试了一下,MapStruct 目前(1.3.1.Final 及之前)的版本暂不支持直接将 map 转换成 JavaBean,很早之前有人在 GitHub提了这个 feature(Please add a feature to map from java.util.map to an object #1075),但是 MapStruct 版本发布比较慢,预计会在 1.4 版本实现该功能,后续跟进一下。

          当然目前版本也可以通过 MapStruct 的一些特性来间接实现 map 转换为 JavaBean,其中一种方式是使用 @Mapping注解中的 expression 表达式指定 map 中的 key 和 JavaBean 字段的映射关系,如下例 map 转换为 Person 对象:

Person

public class Person {
    private String name;
    private String hobby;
    private String school;

    public String getName() {
        return name;
    }

    public void setName(String name) {
        this.name = name;
    }

    public String getHobby() {
        return hobby;
    }

    public void setHobby(String hobby) {
        this.hobby = hobby;
    }

    public String getSchool() {
        return school;
    }

    public void setSchool(String school) {
        this.school = school;
    }

    @Override
    public String toString(){
        return new StringBuilder().append("{").append("name:").append(name).append(",hobby:")
                .append(hobby).append(",school:").append(school).append("}").toString();
    }
}

Converter: 

@Mapper
public interface Converter {
    Converter INSTANCE = Mappers.getMapper(Converter.class);

    @Mappings({@Mapping(expression = "java(map.get(\"name\"))", target = "name"),
            @Mapping(expression = "java(map.get(\"hobby\"))", target = "hobby"),
            @Mapping(expression = "java(map.get(\"school\"))", target = "school")})
    Person mapPerson(Map<String, String> map);
}

Test 类

public class Test {

    public static void main(String[] args) {
        Map<String,String> map = new HashMap<String, String>();
        map.put("name", "小明");
        map.put("hobby", "足球");
        map.put("school", "育英小学");
        Person person = Converter.INSTANCE.mapPerson(map);
        System.out.println(person);
    }
}

输出结果:

{name:小明,hobby:足球,school:育英小学}

这种方式虽然可行,但是感觉不理想,还是写了很多 map.get("xxx"), 只不过写到了 @Mapping 注解中了。(不过@Mapping 注解中的 expression 表达式很有意思)

还有一种利用自定义注解的方式,但是感觉太繁琐了,而且很难阅读,更不推荐了,可以参考下面的参考文档。

参考文档

https://stackoverflow.com/questions/42226847/mapstruct-mapping-from-java-util-map-to-bean

https://stackoverflow.com/questions/54600965/mapstruct-hashmap-as-source-to-object

版权声明:本文为博主原创文章,遵循 CC 4.0 BY-SA 版权协议,转载请附上原文出处链接和本声明。
本文链接:https://blog.csdn.net/qq_22076345/article/details/108188977

智能推荐

linux mysql_ztq小天的博客-程序员宝宝

--stu_info表+----+------+------------+-------------+| id | name | birth | tel |+----+------+------------+-------------+| 1 | ztq | 1994-12-29 | 159****0773 || 2 | tqz | 1994-11-2...

2021-2027全球与中国玻璃纤维捻线机市场现状及未来发展趋势_恒州诚思的博客-程序员宝宝

在玻璃纤维捻线机的主要生产者中,Saurer在2019年的市场份额排名中保持第一位,其次是Jingwei Textile、TECHNOLOGY、Jiangyin Xinjie和Jiangsu Kaizhou。 2019年,排名前5位的企业占全球玻璃纤维捻线机收入市场份额的78%。玻璃纤维捻线机的收入市场分为五个地理区域。中国在2019年占据了最大的收入市场份额,占43%,其次是欧洲,日本和亚太其他地区,其他地区的市场较小。根据产品类型,预计40-100锭玻璃纤维加捻机类型细分市场将在预测期内占据最大..

mxnet/gluon的transforms用法_菜鸟川的博客-程序员宝宝

文章目录gluon 提供了mxnet.gluon.data.vision.transforms的module,这里列出来方便查阅1.顺序组合多个变换:transforms.Compose2.转换输入为特定类型:transforms.Cast3.NDArray转成Tensor:transforms.ToTensor4.利用均值和方差归一化:transforms.Normalize5.随机...

【Python】​​​​​​​turtle八边形绘制_yangbocsu的博客-程序员宝宝_turtle八边形绘制

【Python】turtle八边形绘制‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬描述使用turtle库,绘制一个八边形。‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‮‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‭‬‫‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬‪‬‪‬‪‬‪‬‪‬‮‬‫‬‪‬注意:这是一个自动评阅题目,请补.

Tcl与Design Compiler (十)——其他的时序约束选项(一)_weixin_33721344的博客-程序员宝宝

本文如果有错,欢迎留言更正;此外,转载请标明出处http://www.cnblogs.com/IClearner/ ,作者:IC_learner  之前讲了基本的时序路径约束,现在我们来看一下其他的约束,然后通过实战来讲解一些其他的约束。实战中也没有前面的“理论”中的约束类型,但是可以通过实战来了解其他的约束。本文的具体内容是:    ·多时钟同步约束    ·门控时钟的约束 ...

随便推点

【VUE】过滤器Filter_RogerQianpeng的博客-程序员宝宝_过滤vue

前言注意,filter在Vue3中已经删除。本文回顾filter,并扩展内容,再引出下一篇的Computed。是什么功能:对需要显示的数据,进行一定的格式化操作后再显示注意:filter不会修改原本的数据,而是基于原本的数据来产生新的数据。使用方法HTML中&lt;!-- 1 在双花括号中 --&gt;{{ message | capitalize }}&lt;!-- 2 在 `v-bind` 中 --&gt;&lt;div v-bind:id="rawId | formatId

刷题upupup【Java中Queue、Stack、Heap用法总结】_weixin_30797027的博客-程序员宝宝

【Queue】先进先出(First-In-First-Out),LinkedList实现了Queue接口。它只允许在表的前端进行删除操作,而在表的后端进行插入操作。add() 增加一个元索如果队列已满,则抛出一个IIIegaISlabEepeplian异常remove()移除并返回队列头部的元素如果队列为空,则抛出一个No...

Android 动态壁纸(Wallpaper)编程步骤。。_wo61904004shi的博客-程序员宝宝

说话所谓android动态壁纸一直不被开发者看好,原因冒失有很多。费电了,什么的。。得得,还是记录下刚看的动态壁纸吧。。首先(1)我们要有一个service 当然是wallpaper的service了。。(WallpaperService)。是service 当然有一个生命周期了。。 @Override public void onCreate() {

ibatis的resultClass与resultMap_打豆豆的隔壁小王的博客-程序员宝宝

ibatis的resultClass与resultMap还是有很大的区别。以下是我碰到的一个问题。     配置文件写法如下:    1 sqlMap> 2 typeAlias alias="notice" type="path.country.basic

2016年蓝桥杯A组 第六题 寒假作业_f_zyj的博客-程序员宝宝

今年的题不知为什么,第三道是考的dfs,这第六道同样是考的dfs,看来深度优先遍历是需要好好学学的!寒假作业现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □(如果显示不出来,可以参见【图1.jpg】)每个方块代表1~13中的某一个数字,但不能重复。 比如: 6 + 7 = 13

jsp sql执行代码_ake62381的博客-程序员宝宝

package com.db;import java.sql.*;public class ExecuteDB extends Connect{private Connection conn;private Statement stmt;private ResultSet rs;private String errorMessage;public Execute...

推荐文章

热门文章

相关标签