====== MapStruct Object factories ======
日常在使用 ''MapStruct'' 时 target object 都是由 ''MapStruct'' 直接调用 ''NoArgsConstruct'' 生成的。
还有一种场景就是 target object 有外部依赖需要注入,或者没有 ''NoArgsConstruct'' 方法供我们调用,这里就需要我们配置 ''MapStruct'' 的 ''@Mapper()'' 注解 的 ''uses'' 参数。
这个参数支持配置单个或者多个 ''ObjectFactory'' 工厂类,有两类实现方法,一类是直接写 target object 的生成方法,另一类是写通用 object 的生成方法,示例代码如下,摘自官方文档
@Component
public class DtoFactory {
public CarDto createCarDto() {
return // ... custom factory logic
}
}
@Component
public class EntityFactory {
public T createEntity(@TargetType Class entityClass) {
return // ... custom factory logic
}
}
@Mapper(componentModel = "spring", uses= { DtoFactory.class, EntityFactory.class } )
public interface CarMapper {
CarDto carToCarDto(Car car);
Car carDtoToCar(CarDto carDto);
}
另外 ''MapStruct'' 在 ''ObjectFactory'' 中支持为 ''create'' 添加一个 ''@ObjectFactory'' 注解,当使用该注解时可以将 convertor 中 source object 作为入参使用,示例如下:
public class DtoFactory {
@ObjectFactory
public CarDto createCarDto(Car car) {
return // ... custom factory logic
}
}
===== 参考文献 =====
* [[https://mapstruct.org/documentation/stable/reference/html/#object-factories|object factories - 官方文档]]
{{tag>java mapstruct dto}}