You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

如何确保MapStruct使用标注了@ObjectFactory注解的方法

如何确保MapStruct使用标注了@ObjectFactory注解的方法

我最近在规整自己的MapStruct映射流程,想让所有映射逻辑都遵循统一的规范,所以专门定义了几个通用接口来简化新类型映射器的开发——这样每次新增映射类型时能省不少重复工作。比如我定义了一个处理循环引用的MappableCyclic接口:

import lombok.NonNull;  

public interface MappableCyclic<IN extends MappableCyclic<IN>> {    
    void beforeMapping(@NonNull IN in, @NonNull ReferenceCycleTracking context);    
    void afterMapping(@NonNull IN in, @NonNull ReferenceCycleTracking context);
}

回到核心问题,要确保MapStruct乖乖使用标注了@ObjectFactory注解的方法,你可以试试这几个实用的办法:

  • 明确关联工厂类:在你的映射器接口上,通过@Mapper注解的uses属性引入包含@ObjectFactory方法的类。举个例子,如果你的工厂类是CycleAwareMapperFactory,写法如下:

    @Mapper(uses = CycleAwareMapperFactory.class)
    public interface YourBusinessMapper {
        // 这里定义你的具体映射方法
    }
    

    这样MapStruct在创建目标对象时,会优先调用这个工厂里标注了@ObjectFactory的方法,而不是默认的构造器。

  • 结合自定义接口做逻辑扩展:像上面的MappableCyclic接口,你可以把工厂方法和它结合起来,让实例化逻辑更贴合自己的规范。比如工厂方法可以这么写:

    public class CycleAwareMapperFactory {
        @ObjectFactory
        public <T extends MappableCyclic<T>> T createTargetInstance(Class<T> targetType, ReferenceCycleTracking context) throws Exception {
            // 用反射创建目标对象实例
            T instance = targetType.getDeclaredConstructor().newInstance();
            // 提前调用接口的beforeMapping做初始化操作
            instance.beforeMapping(null, context);
            return instance;
        }
    }
    

    只要目标类型实现了MappableCyclic,MapStruct就能自动匹配到这个工厂方法来生成实例。

  • 检查注解和方法签名:一定要确认@ObjectFactory注解是MapStruct自带的(包路径是org.mapstruct.factory.ObjectFactory),别导错其他包的注解。另外工厂方法的参数要合理,比如可以传入目标类型、源对象或者映射上下文,这样MapStruct才能正确识别并调用它。

  • 查看生成的实现类:如果还是不确定有没有生效,你可以直接看MapStruct自动生成的映射实现类(一般在target/generated-sources目录下),看看里面创建目标对象的代码是不是调用了你定义的@ObjectFactory方法。或者开启MapStruct的DEBUG日志,也能看到详细的生成过程。

备注:内容来源于stack exchange,提问作者r-uu

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.04.13 16:03:08