网站首页 > java教程 正文
我们在开发的过程中对于领域进行了分层,像是VO/DTO/BO/DAO等,这样分层的好处是看到实体对象的名称就可以知道实体类对应的功能,但是同时也给开发带来了不便,就是各种对象的转换,如果一个对象有几个字段,我们直接调用get set方法即可,如果要是有十几个字段或者更多呢?可能还会涉及到类型的转换,如果这样就会导致满屏幕的get set方法,不仅感觉很low,而且不符合软件的精神——不要重复造轮子。下面给大家推荐一款比较好用的插件,他可以用来完成实体类之间的转换工作,并且可以自定义转换方法-MapStruct。
准备工作:
Maven配置,需要我们在pom文件中添加以下引用
<properties> <org.mapstruct.version>1.2.0.Final</org.mapstruct.version> </properties> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-jdk8</artifactId> <version>${org.mapstruct.version}</version> </dependency> <dependency> <groupId>org.mapstruct</groupId> <artifactId>mapstruct-processor</artifactId> <version>${org.mapstruct.version}</version> </dependency>
需要注意的是如果项目中使用了swagger,需要放到swagger的上面,不然运行会出错
普通用法:
@Mapper(componentModel = "spring")// 方便通过注解的方式使用 public interface AccessToOpenApiInfoMapper { /** 映射器的实例,可以通过这个调用相应的方法,这个可以不用要,是线程安全的可以安心使用 *调用的例子代码: *OpenApiInfo openApiInfo = AccessToOpenApiInfoMapper .INSTANCE.from( access ); */AccessToOpenApiInfoMapper INSTANCE = Mappers.getMapper(AccessToOpenApiInfoMapper.class);@Mappings({@Mapping(source = "value", target = "apiCode"),@Mapping(source = "label", target = "apiName")})OpenApiInfo from(Access access);List<OpenApiInfo> fromList(List<Access> accessList);//反向生成@InheritInverseConfigurationAccess fromBack(OpenApiInfo serviceNoApiCodeXref);@InheritInverseConfigurationList<Access> fromBackList(List<OpenApiInfo> openApiInfoList);}
进阶用法:
多个源参数的映射方法
MapStruct还支持具有多个源参数的映射方法。这很有用,例如为了将多个实体组合成一个数据传输对象。以下是一个示例:
示例:多个源参数的映射方法
@MapperpublicinterfaceAddressMapper{ @Mappings({ @Mapping(source = "person.description", target = "description"), @Mapping(source = "address.houseNo", target = "houseNumber") }) DeliveryAddressDto personAndAddressToDeliveryAddressDto(Person person, Address address);}
上例所示的映射方法采用两个源参数并返回组合的目标对象。与单参数映射方法一样,属性按名称映射。
如果多个源对象定义具有相同名称的属性,则必须使用@Mapping注解指定从中检索属性的source参数,如示例中的description属性所示。如果不解决这种歧义,将会引发错误。对于在给定源对象中仅存在一次的属性,可以选择指定源参数的名称,因为它可以自动确定。
使用@Mapping注解时,必须指定属性所在的参数。
如果所有源参数都为null,则具有多个源参数的映射方法将返回null。否则,将实例化目标对象,并且将传递所提供参数的所有属性。
嵌套映射
MapStruct将通过“.”符号处理嵌套映射(在源代码中):
示例11:具有多个源参数的映射方法
@Mappings({ @Mapping(target = "chartName", source = "chart.name"), @Mapping(target = "title", source = "song.title"), @Mapping(target = "artistName", source = "song.artist.name"), @Mapping(target = "recordedAt", source = "song.artist.label.studio.name"), @Mapping(target = "city", source = "song.artist.label.studio.city"), @Mapping(target = "position", source = "position") }) ChartEntry map(Chart chart, Song song, Integer position); MapStruct将对源中的每个嵌套属性执行空检查。
也可以以这种方式映射非java bean源参数(如java.lang.Integer)。
实体属性转换
@Mapping(source = "endTime", target = "endTime", dateFormat = "yyyy-MM-dd HH:mm:ss"),
@Mapping 中的ignore 赋值 true可以忽略某个字段(这个主要是在字段相同,但是类型不同,并且不能装换的时候用)
问题:如果多个list这个default是怎么做到的?可以看下源码
@Mapping(source = "pm25", target = "pm25", qualifiedByName = "formatDoubleDef") AreaVO areaPO2areaVO(AreaPO areaPO); @Named("formatDoubleDef")//需要起个名字,不然报错,可以与方法名一致,当然也可以不一致 default Double formatDouble(Double source) { DecimalFormat decimalFormat = new DecimalFormat("0.00");//小数位格式化 if (source == null) { source = 0.0; } return Double.parseDouble(decimalFormat.format(source)); }
多个类转换的时候要把默认方法写后面
CustomerRVO form(User user, EnterpriseIdentity enterpriseIdentity); default UserTypeEnum stringToEnum(String s) { switch (s) { case "PAAS_CLIENT": return UserTypeEnum.PlatformUser; default: return null; }}
猜你喜欢
- 2024-10-03 SpringBoot中如何根据JSON数据生成一个动态对象?
- 2024-10-03 边玩手机边学Java----Java基础之Map
- 2024-10-03 Java Stream API:优雅地操作Map(java map stream filter)
- 2024-10-03 聊聊Mybatis的初始化之Mapper.xml映射文件的解析
- 2024-10-03 MapStruct 使用教程, 万字详解(mapstruct enum)
- 2024-10-03 看似简单,在JAVA中如何将一个Object转换成Array
- 2024-10-03 java8函数式Map操作也太强大了吧,1次就帮我省了10多行代码
- 2024-10-03 map的一个骚操作!你学废了么?#互联网
- 2024-10-03 轻松搞定!用JavaScript将列表转换为Map
- 2024-10-03 告别 BeanUtils,拥抱 MapStruct:高效 Java 对象映射的经典之选
你 发表评论:
欢迎- 最近发表
- 标签列表
-
- java反编译工具 (77)
- java反射 (57)
- java接口 (61)
- java随机数 (63)
- java7下载 (59)
- java数据结构 (61)
- java 三目运算符 (65)
- java对象转map (63)
- Java继承 (69)
- java字符串替换 (60)
- 快速排序java (59)
- java并发编程 (58)
- java api文档 (60)
- centos安装java (57)
- java调用webservice接口 (61)
- java深拷贝 (61)
- 工厂模式java (59)
- java代理模式 (59)
- java.lang (57)
- java连接mysql数据库 (67)
- java重载 (68)
- java 循环语句 (66)
- java反序列化 (58)
- java时间函数 (60)
- java是值传递还是引用传递 (62)
本文暂时没有评论,来添加一个吧(●'◡'●)