bean转换-mapstruct

1. 本文提供了一种bean转换属性赋值的新姿势 ,比beanUtils.comPropertity()更优雅,本文不讨论原理和性能,仅记录用法

2. 重要:要使用mapstruct 必须引入其pom包,并且如果你使用了lombok,则对lombok的版本也有要求,否则可能因为无法解析lombok而导致功能无效,同时其对maven的打包版本也有要求,应保持在3.6.0以上

<properties>
    <lombok.version>1.18.2</lombok.version>
    <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>

<build>
        <plugins>
            <plugin>
                <groupId>org.apache.maven.plugins</groupId>
                <artifactId>maven-compiler-plugin</artifactId>
                <version>3.8.1</version>
                <configuration>
                    <source>1.8</source>
                    <target>1.8</target>
                    <encoding>UTF-8</encoding>
                    <showWarnings>true</showWarnings>
                    <annotationProcessorPaths>
                        <path>
                            <groupId>org.projectlombok</groupId>
                            <artifactId>lombok</artifactId>
                            <version>${lombok.version}</version>
                        </path>
                        <path>
                            <groupId>org.mapstruct</groupId>
                            <artifactId>mapstruct-processor</artifactId>
                            <version>${org.mapstruct.version}</version>
                        </path>
                    </annotationProcessorPaths>
                </configuration>
            </plugin>
        </plugins>
    </build>

3.待转换的两个对象

@Data
public class AppDO {

    private String appName;

    /**
     * 平台:0:IOS/1:Android
     **/
    private int appOs;

    private String updateTime;
}

@Data
public class AppVO {

    private String appName;

    /**
     * 平台:0:IOS/1:Android
     **/
    private String appOs;

    private String updateTime;
}


@Getter
@AllArgsConstructor
public enum AppOsEnum {
    IOS(0, "IOS"),
    ANDROID(1, "Android"),
    ;

    private int value;

    private String name;

    public static String getName(int value) {
        for (AppOsEnum osEnum : AppOsEnum.values()) {
            if(value == osEnum.value){
                return osEnum.getName();
            }
        }
        return "";
    }
}

4.实现对象转换其中我想把一个int值对应转换成其枚举对应的String

@Mapper(componentModel = "spring", uses = {OsUse.class})
public interface AppConvert {

    @Mapping(target = "appOs",source = "appOs",qualifiedByName = "toAppOs")
    AppVO AppConvertAppDTO(AppDO appDO);
}

 如果没有特殊逻辑处理的话其实这样就可以了

@Mapper(componentModel = "spring")
public interface AppConvert {
    AppVO AppConvertAppDTO(AppDO appDO);
}

5.看下特殊的处理类

/**
 * @Desc:
 * 处理特殊属性赋值,默认是根据参数类型去处理的
 * 如果多个方法没有相同的出参和入参时可不指定方法
 * @Author wangwei
 * @Date 2021/4/20 6:46 下午
**/
@Component
public class OsUse {

    @Named("toAppOs")
    public String toAppOs(int os){
        return AppOsEnum.getName(os);
    }

}

 

posted @ 2021-04-20 19:27  隔壁w王叔叔  阅读(194)  评论(0)    收藏  举报