MapStruct 自定义工厂方法:灵活实例化目标对象
2024-03-16 16:14:04
MapStruct 中的自定义工厂方法
介绍
MapStruct 是一款 Java 框架,它通过反射和代码生成来简化 Java 对象之间的映射。它通常通过无参构造函数或属性映射来实例化目标对象。然而,在某些情况下,我们需要使用自定义工厂方法来实例化目标对象。
使用自定义工厂方法
MapStruct 提供了两种使用自定义工厂方法的方式:
1. 使用 @Mapping
注解
@Mapping(source = "id", target = "referenceId", factoryMethod = "of")
public interface ReferenceIdMapper {
ReferenceId map(UUID id);
}
factoryMethod
属性指定了要使用的自定义工厂方法的名称。
2. 在 Mapper 接口中定义方法
public interface ReferenceIdMapper {
ReferenceId createReferenceId(UUID id);
default ReferenceId map(UUID id) {
return createReferenceId(id);
}
}
createReferenceId
方法是自定义工厂方法。它返回一个 ReferenceId
对象。
示例
让我们创建一个名为 ReferenceId
的类,它有一个私有构造函数:
public class ReferenceId {
private final UUID id;
private ReferenceId(UUID id) {
this.id = id;
}
public static ReferenceId of(UUID id) {
return new ReferenceId(id);
}
// 省略 getter 和 setter 方法
}
使用 MapStruct,我们可以创建如下所示的 mapper:
@Mapper
public interface ReferenceIdMapper {
ReferenceIdMapper INSTANCE = Mappers.getMapper(ReferenceIdMapper.class);
@Mapping(source = "id", target = "id", factoryMethod = "of")
ReferenceId map(UUID id);
}
当调用 ReferenceIdMapper.map(id)
时,MapStruct 将使用 ReferenceId.of(id)
工厂方法来实例化 ReferenceId
对象。
结论
自定义工厂方法为 MapStruct 提供了在实例化目标对象时增加灵活性。这在无法使用无参构造函数或属性映射的情况下非常有用。
常见问题解答
1. 何时应该使用自定义工厂方法?
当目标对象无法使用无参构造函数或属性映射实例化时,应该使用自定义工厂方法。
2. 如何指定自定义工厂方法的名称?
使用 @Mapping
注解的 factoryMethod
属性或在 mapper 接口中定义自定义方法的名称。
3. 自定义工厂方法可以返回什么类型?
自定义工厂方法可以返回 mapper 接口中目标对象的类型。
4. 是否可以重载自定义工厂方法?
否,自定义工厂方法不能重载。
5. MapStruct 如何找到自定义工厂方法?
MapStruct 根据 mapper 接口和目标对象的类型在 mapper 类中查找自定义工厂方法。