1

背景

项目采用mapstruct做对象属性拷贝,项目的多个实体类有相同的属性,比如createTime,在配置映射时如果都用忽略某个映射的数据,或则修改映射属性名,那每个@Mappings里都要配置:

@Mappings(value = {
        @Mapping(target = "id", ignore = true),
        @Mapping(source = "createTime", target = "insertTime")
})

是否可以将这样相同的配置抽取出来?

解决方案

官方文档:MapStruct 1.4.2.Final Reference Guide
image.png

代码

公共配置:

@Retention(RetentionPolicy.CLASS)
@Mappings(value = {
        @Mapping(target = "id", ignore = true),
        @Mapping(source = "createTime", target = "insertTime")
})
public @interface CommonEntityMapping {

}

实际使用:

@Mappings(value = {
        @Mapping(source = "filed1", target = "field2")
})
@CommonEntityMapping
MyEntity convert(MyModel myModel);

另:项目刚开始使用的mapstruct版本是1.2.0-Final,不支持在上注解@Mappings,升级到1.4.2-Final后支持了。

进阶

那如果是只想一个类有很多字段,但是只想映射其中少了的几个字段呢?
可以在@Mapping时设置ignore = true

@Mapping(target = "id", ignore = true)

但是如上诉所说,如果类有很多个字段的情况下,还得给每个字段加上配置,太麻烦了,是否还有其他方式?
可以通过配置@BeanMapping(ignoreByDefault = true)类忽略没有配置@Mapping的字段。MapStruct 1.4.2.Final Reference Guide - defining-mapper
还可以通过配置unmappedTargetPolicy的方式。MapStruct 1.4.2.Final Reference Guide - shared-configurations


noname
314 声望49 粉丝

一只菜狗