我可以强制 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);
}
答案 0 :(得分:0)
不,不能强制使用 MapStruct。内置转换方法。
您可以做的是创建一些将在 java.util.Date
和 ZonedDateTime
之间映射的包装器对象,然后 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
}
}