MapStruct是一个属性映射工具,只需要自定义一个Mapper接口或者抽象的Mapper类,MapStruct就会自动为你实现该接或抽象方法,避免了映射实现的繁杂细节。官网地址:http://mapstruct.org/。
三、工具使用1、添加依赖
implementation 'org.mapstruct:mapstruct:1.3.1.Final' annotationProcessor "org.mapstruct:mapstruct-processor:1.3.1.Final"
2、定义接口或抽象方法,并添加@Mapper
@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT, unmappedTargetPolicy = ReportingPolicy.IGNORE,imports = {LocalDateTime.class})
public abstract class SPAQuoteMapper {
}
@Mapper用于接口或者抽象类,重要属性解读:(1)nullValueMappingStrategy,如果源实体类的某个属性为null,映射到目标实体类的某个属性时,如何处理,有RETURN_NULL和RETURN_DEFAULT两个策略。(2)unmappedTargetPolicy,如果目标实体类中的某些属性在源实体类中无可以映射的属性,如何处理,详情参考:https://www.baeldung.com/mapstruct-ignore-unmapped-properties。(3)imports,MapStruct会自动为接口或者抽象类生成一个实现类,import相当于为实现类声明需要import的类。
3、添加映射方法
@Mapper(componentModel = "spring", nullValueMappingStrategy = NullValueMappingStrategy.RETURN_DEFAULT, unmappedTargetPolicy = ReportingPolicy.IGNORE,imports = {LocalDateTime.class})
public abstract class SPAQuoteMapper {
@Mapping(source = "press.location", target = "pressDTO.place")
@Mapping(source = "press.location", target = "pressDTO.place", qualifiedByName = "toBigDecimal")
documentDTO documentTodocumentDTO(document entity);
@Named("toBigDecimal")
private BigDecimal changeStringToDecimal(String number) {
return new BigDecimal(number);
}
}
相关实体类如下:
public class documentDTO {
private int id;
private String title;
private String text;
private PressDTO pressDTO;
private List comments;
private String author;
}
public class PressDTO {
private String place;
private String name;
private BigDecimal assetsAmount;
}
public class document {
private int id;
private String title;
private String text;
private Press press;
private Date modificationTime;
}
public class Press {
private String location;
private String name;
private String assetsVolume;
}
4、使用
IngressOrderMapper ingressOrderMapper = Mappers.getMapper(IngressOrderMapper.class);



