跳到主要内容

MapStruct

官网: https://mapstruct.org/

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