如何确保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

