MapStruct使用

MapStruct,是一个参数转换器,类似apache的BeanUtil.copyProperties,但是MapStruct的性能要比copyProperties的性能好。copyProperties只能作用在同类型的属性上并且属性还要一样,还会容易出现异常,有些规范会严禁使用这个方法进行参数转换。

MapStruct的原理类似lombok,MapStruct都是在编译期进行实现的,而且是基于get、set,没有使用反射所以一般不存在运行时性能问题。

 

引入依赖

<dependency>

    <groupId>org.mapstruct</groupId>

    <artifactId>mapstruct</artifactId>

    <version>1.3.1.Final</version>

</dependency>

<dependency>

    <groupId>org.mapstruct</groupId>

    <artifactId>mapstruct-processor</artifactId>

    <version>1.3.1.Final</version>

</dependency>

 

例1.

import org.mapstruct.Mapper;

import org.mapstruct.Mapping;

import org.mapstruct.Mappings;



@Mapper(componentModel = "spring")//MapStruct 转换 Mapper 注入Spring IoC 容器

public interface SearchItemOutputConverter {

    /**

     * 商品单普通属性rest入参转dubbo入参

     *

     * @param itemGeneralPropInfo

     * @return

     */

    @Mappings({

            @Mapping(source = "propId", target = "explainCode"),

            @Mapping(source = "propName", target = "explainName"),

            @Mapping(source = "propValue", target = "explainNote"),

            @Mapping(source = "user.userName", target = "userName"),

            @Mapping(source = "money", target = "goods.price"),

            @Mapping(target = "password", ignore = true),//忽略此属性

            @Mapping(target = "createTime", dateFormat = "yyyy-MM-dd HH:mm:ss")//格式化

    })

    ItemGenericAttribute rpc2rest(ItemGeneralPropInfo itemGeneralPropInfo);

}

 

备注:user是itemGeneralPropInfo里面的一个user对象;goods是ItemGenericAttribute里面的对象;如果ItemGeneralPropInfo和ItemGenericAttribute里面的属性名一样的话,就会默认直接转换,不需要指定了。对于包装类型,是自动拆箱封箱操作的,并且是线程安全的。

MapStruct编译之后会在maven下面的子目录( maven是 target\generated-sources\annotations)生成一个实现类(SearchItemOutputConverterImpl)


 

例2:

@Mapping(target = "stringProperty", source = "stringProp", defaultValue = "undefined")

备注:设置默认值,当目标为null时我们可以设置默认值,这些都是基本类型或者是包装类型

 

例3:

@Mapping(target = "stringConstant", constant = "Constant Value")

备注:设置常量的时候是不能指定source的,直接指定常量值

 

例4:

@Mapping(source = "price", numberFormat = "$#.00")

备注:数字格式化,遵循java.text.DecimalFormat的规范

 

例5:

@IterableMapping(dateFormat = "dd.MM.yyyy")

List<String> stringListToDateList(List<Date> dates);

备注:将一个日期集合映射到日期字符串集合的格式化

 

例6:

default List<UserConfig> strConfigToListUserConfig(String config) {

     return JSON.parseArray(config, UserConfig.class); 

}

备注:自定义类型转换,直接在转换器里面添加自定义转换方法,示例中的config是某个对象里面的一个json字符串属性,需要转为对象。定义好方法之后,MapStruct当匹配到合适类型的字段时,会调用自定义的转换方法进行转换

自定义的默认方法只支持jdk1.8及以上

 

例7:

@Mappings({ @Mapping(target = "createTime", expression = "java(com.java.mmzsblog.util.DateTransform.strToDate(source.getCreateTime()))"), }) 

UserVO3 toConvertVO3(User source);

备注:会使用com.java.mmzsblog.util.DateTransform.strToDate 这个方法对数据进行处理然后赋值。

 

如果项目里面也使用了Lombok时,Lombok的版本要高于或者等于1.18.10,否则会有编译不通过的情况

  • 0
    点赞
  • 2
    收藏
    觉得还不错? 一键收藏
  • 0
    评论
评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值