返回

MapStruct 自定义工厂方法:灵活实例化目标对象

java

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 类中查找自定义工厂方法。