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); } }

浙公网安备 33010602011771号