背景呼叫公司的图像识别服务接口、返回值都多为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