MapStruct
expression 来指定一个 Java 表达式
@Mapper
public interface CarMapper {
@Mapping(target = "make", source = "make")
@Mapping(target = "seatCount", source = "numberOfSeats")
@Mapping(target = "manufacturingDate", expression = "java(new java.text.SimpleDateFormat(\"yyyy-MM-dd\").format(car.getManufacturingDate()))")
CarDto carToCarDto(Car car);
}
自定义方法
@Mapper
public interface CarMapper {
@Mapping(target = "make", source = "make")
@Mapping(target = "seatCount", source = "numberOfSeats")
@Mapping(target = "manufacturingDate", source = "manufacturingDate", dateFormat = "yyyy-MM-dd")
@Mapping(target = "type", source = "type", qualifiedByName = "typeToTypeDto")
CarDto carToCarDto(Car car);
@Named("typeToTypeDto")
default String typeToTypeDto(Type type) {
return type != null ? type.getDescription() : null;
}
}
使用 @AfterMapping 和 @BeforeMapping
@Mapper
public interface CarMapper {
@Mapping(target = "make", source = "make")
CarDto carToCarDto(Car car);
@AfterMapping
default void setAdditionalData(@MappingTarget CarDto carDto, Car car) {
carDto.setAdditionalInfo("Processed on: " + LocalDate.now());
}
}
使用装饰器设计模式
@Mapper(uses = CarMapperDecorator.class)
public interface CarMapper {
@Mapping(target = "make", source = "make")
CarDto carToCarDto(Car car);
}
public abstract class CarMapperDecorator implements CarMapper {
private final CarMapper delegate;
public CarMapperDecorator(CarMapper delegate) {
this.delegate = delegate;
}
@Override
public CarDto carToCarDto(Car car) {
CarDto dto = delegate.carToCarDto(car);
// 添加额外的逻辑
dto.setExtraField("Value");
return dto;
}
}
source 对象的多个属性转为 target 对象的一个属性
XxxVO toVOSimply(XxxEntity entity);
@IterableMapping(qualifiedByName = "toVO")
List<XxxVO> toVO(List<XxxEntity> entity);
@Named("toVO")
default XxxVO toVO(XxxEntity entity) {
XxxVO vo = toVOSimply(entity);
// 自定义多个属性转一个属性逻辑
vo.setConnection(ArrayUtil.join(new String[]{vo.getConnectionType1(),
vo.getConnectionType2(),
vo.getConnectionType3()},
","));
return vo;
}