我可以强制 mapstruct 将映射方法委托给另一个映射方法或默认(内置)转换吗?

时间:2021-06-28 08:19:06

标签: mapstruct

我可以强制 mapstruct 将映射方法委托给另一个映射方法或默认(内置)转换吗?

我基本上想在使用 MapperX 的自定义映射方法中访问 uses MapperA 的自定义映射方法。但是我在MapperX的自定义映射方法中无法获取注入的MapperA。

内置转换也是如此。我想在自定义方法中使用 mapstruct 的内置转换。就像从 Date 转换为 ZonedDateTime。

例如:

@Mapper(componentModel="cdi")
public interface MapperA {
    A fromB(B b);
    
    default Q fromR(R r) {
        Q q = ..<do some stuff with r>..
        return q;
    }
}

@Mapper(componentModel="cdi"
    uses = MapperA.class
)
public interface MapperX {
    default X custom(Y y) {
        Date someJavaUtilDate = customDateFromY(y);
        //I dont want to code Date->ZonedDateTime myself
        //I want mapstruct to do its builtin conversion, so call placeholder:
        X.myZonedDateTime = builtinConversionPlaceholder(someJavaUtilDate)
        
        R r = ..<do some stuff with y>..
        X.q = usesMapperPlaceholder(r); // injected "uses MapperA" is not directly accessible here?
    }
    
    @org.mapstruct.Find_Me_A_Matching_Method_Builtin_Or_In_Uses_Mapper
    // will not map properties of Date to ZonedDateTime
    // but will use mapstruct builtin conversion code
    ZonedDateTime builtinConversionPlaceholder(java.util.Date date);
    
    @org.mapstruct.Find_Me_A_Matching_Method_Builtin_Or_In_Uses_Mapper
    // will delegate to MapperA.fromR
    Q usesMapperPlaceholder(R r);
}

1 个答案:

答案 0 :(得分:0)

不,不能强制使用 MapStruct。内置转换方法。

您可以做的是创建一些将在 java.util.DateZonedDateTime 之间映射的包装器对象,然后 MapStruct 将使用内置映射来映射这些对象。

例如

@Mapper(componentModel="cdi")
public interface MapperA {
    A fromB(B b);
    
    default Q fromR(R r) {
        Q q = ..<do some stuff with r>..
        return q;
    }
}

@Mapper(componentModel="cdi"
    uses = MapperA.class
)
public abstract class MapperX {

    @Inject
    MapperA mapperA;

    default X custom(Y y) {
        Date someJavaUtilDate = customDateFromY(y);
        X.myZonedDateTime = toZonedDateTime(someJavaUtilDate).getValue();
        
        R r = ..<do some stuff with y>..
        X.q = mapperA.fromR(r);
    }
    
    Wrapper<ZonedDateTime> toZonedDateTime(Wrapper<java.util.Date> date);
    
    static class Wrapper<T> {
        private T value;

        //getters and setters
        
    }
}
相关问题