技术标签: 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
--stu_info表+----+------+------------+-------------+| id | name | birth | tel |+----+------+------------+-------------+| 1 | ztq | 1994-12-29 | 159****0773 || 2 | tqz | 1994-11-2...
在玻璃纤维捻线机的主要生产者中,Saurer在2019年的市场份额排名中保持第一位,其次是Jingwei Textile、TECHNOLOGY、Jiangyin Xinjie和Jiangsu Kaizhou。 2019年,排名前5位的企业占全球玻璃纤维捻线机收入市场份额的78%。玻璃纤维捻线机的收入市场分为五个地理区域。中国在2019年占据了最大的收入市场份额,占43%,其次是欧洲,日本和亚太其他地区,其他地区的市场较小。根据产品类型,预计40-100锭玻璃纤维加捻机类型细分市场将在预测期内占据最大..
文章目录gluon 提供了mxnet.gluon.data.vision.transforms的module,这里列出来方便查阅1.顺序组合多个变换:transforms.Compose2.转换输入为特定类型:transforms.Cast3.NDArray转成Tensor:transforms.ToTensor4.利用均值和方差归一化:transforms.Normalize5.随机...
【Python】turtle八边形绘制描述使用turtle库,绘制一个八边形。注意:这是一个自动评阅题目,请补.
本文如果有错,欢迎留言更正;此外,转载请标明出处http://www.cnblogs.com/IClearner/ ,作者:IC_learner 之前讲了基本的时序路径约束,现在我们来看一下其他的约束,然后通过实战来讲解一些其他的约束。实战中也没有前面的“理论”中的约束类型,但是可以通过实战来了解其他的约束。本文的具体内容是: ·多时钟同步约束 ·门控时钟的约束 ...
前言注意,filter在Vue3中已经删除。本文回顾filter,并扩展内容,再引出下一篇的Computed。是什么功能:对需要显示的数据,进行一定的格式化操作后再显示注意:filter不会修改原本的数据,而是基于原本的数据来产生新的数据。使用方法HTML中<!-- 1 在双花括号中 -->{{ message | capitalize }}<!-- 2 在 `v-bind` 中 --><div v-bind:id="rawId | formatId
【Queue】先进先出(First-In-First-Out),LinkedList实现了Queue接口。它只允许在表的前端进行删除操作,而在表的后端进行插入操作。add() 增加一个元索如果队列已满,则抛出一个IIIegaISlabEepeplian异常remove()移除并返回队列头部的元素如果队列为空,则抛出一个No...
说话所谓android动态壁纸一直不被开发者看好,原因冒失有很多。费电了,什么的。。得得,还是记录下刚看的动态壁纸吧。。首先(1)我们要有一个service 当然是wallpaper的service了。。(WallpaperService)。是service 当然有一个生命周期了。。 @Override public void onCreate() {
ibatis的resultClass与resultMap还是有很大的区别。以下是我碰到的一个问题。 配置文件写法如下: 1 sqlMap> 2 typeAlias alias="notice" type="path.country.basic
今年的题不知为什么,第三道是考的dfs,这第六道同样是考的dfs,看来深度优先遍历是需要好好学学的!寒假作业现在小学的数学题目也不是那么好玩的。 看看这个寒假作业:□ + □ = □ □ - □ = □ □ × □ = □ □ ÷ □ = □(如果显示不出来,可以参见【图1.jpg】)每个方块代表1~13中的某一个数字,但不能重复。 比如: 6 + 7 = 13
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...