swgger map返回注释(小古文100篇及注释译文)
我们在开发的过程中对于领域进行了分层,像是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;}}
如发现本站有涉嫌抄袭侵权/违法违规等内容,请联系我们举报!一经查实,本站将立刻删除。