首页 > 编程知识 正文

MapStruct Map 转换成对象,对象数组转换成对象

时间:2023-05-06 01:51:04 阅读:179647 作者:1659

背景呼叫公司的图像识别服务接口、返回值都多为MapString、Object类型、部分key。 我不想将这样的map结果转换为项目中对应的JavaBean (例如DTO或VO ),也不想为许多DTO.setxxx(map.get )编写代码。 (注意:可以使用fastjson等工具序列化Map并反序列化为DTO类; 本文只关注MapStruct )

经过检查,MapStruct的当前版本(1.3.1.Final 及之前)不支持map到JavaBean的直接转换。 以前在GitHub中提出了这个feature (pleaseaddafeaturetomapfromjava.util.maptoanobject # 1075 ),MapStruct为1.5.0.Beta1

3359 mapstruct.org/news/2021-07-18-mapstruct-1 _5_0_ beta1- is-out /

1.5.0.beta 1的起始版本:官方网站示例:

1.5.0.beta 1之前的版本:

当然,在当前版本中,还可以使用MapStruct的一些特性来间接实现map到JavaBean的转换。 一种方法是使用@Mapping注释的expression表达式指定映射中key字段和JavaBean字段之间的映射关系。 下面的示例将map转换为Person对象:

Person

public class person { privatestring name; 私有字符串主机; 私有字符串; 公共字符串获取名称() { return name; }publicvoidsetname(stringname ) { this.name=name; } public String getHobby () { return hobby; } publicvoidsethobby (string hobby ) { this.hobby=hobby; }公共字符串获取() { return school; } publicvoidsetschool (stringschool ) { this.school=school; } @ overridepublicstringtostring ((return new stringbuilder ) ).append ) ({} ).append('name3360 ' ).append ) nanad }} Converter:

@ mapperpublicinterfaceconverter { converter instance=mappers.get mapper (converter.class ); @mappings((@mapping ),expression='Java ) map.get ),target='name ' ),@mapping ) expressing )。 @ mapping (expression=' Java (map.get ((school ) ),target='school ) personmapperson ) mapstring,school ) } Test 类

public class test { publicstaticvoidmain (string [ ] args ) { MapString,String map=new HashMapString,string ); map.put('name ','孤独的愿望'); map.put(hobby,)足球); map.put(school,)育英小学; person person=converter.instance.map person (map ); system.out.println(Person ); }} 输出结果:

{name:孤独的渴望,hobby:足球,school:育英小学}觉得这种方式是可行的,但并不理想,写了很多map.get('XXX ),但是在@Mapping评论里写了(但是,@Mapping注释的expression公式很有趣)

虽然也有使用自定义注释的方法,但是因为太麻烦了,很难阅读,所以不推荐。 请参阅以下参考文档:

参考文档

mapstruct1.5.0. beta 2参考指南

mapstruct : mappingfromjava.util.maptobean? -堆叠概述

Java-mapstruct 3360 hashmapassourcetoobject-stack overflow

版权声明:该文观点仅代表作者本人。处理文章:请发送邮件至 三1五14八八95#扣扣.com 举报,一经查实,本站将立刻删除。