我已经提到问题Map multiple source fields to same type target fields with Mapstruct但它没有帮助
我的其他资源类如下所示
class Base {
//fields
//getters and setters
}
Class A extends Base{
List<String> emailAdddress;
//other fields
//getters and setters
}
Class B extends Base{
List<String> devices;
//other fields
//getters and setters
}
Class C extends Base{
List<String> mobileNumbers;
//other fields
//getters and setters
}
我的实体类是Source,如下所示:
Class Source {
String address
//other fields
//getters and setters
}
我想在我的mapper类中使用emailAdddress或devices或mobileNumbers映射Source类的地址,我尝试在mapper类中使用@AfterMapping,也尝试使用装饰器类,但它没有帮助。
我有一个像这样的映射器类
@Mapper
public abstract class AddressMapper {
//basic mappings here
public abstract Source toEntity(Base b);
public abstract Base toDomain(Source src);
@AfterMapping
public void setAddressInfo(@MappingTarget Source src, B b) {
src.setAddress(b.getDevices().toString());
}
我不确定我是否完全遵循你想做的事情。
但是,如果你想映射特定的类(A
,B
,C
,你需要把它们放在方法中。由于MapStruct是一个注释处理器,在编译时它只知道你的例子中的Base
字段。你能做什么做的事情如下:
@Maper
public interface AdressMapper {
default Source toEntity(Base b) {
if (b == null) {
return null;
} else if (b instanceOf A) {
toEntity((A) b);
} else if (b instanceOf B) {
toEntity((A) b);
} else if (b instanceOf C) {
toEntity((C) b);
} else {
// Decide what to do
}
}
@Mapping(target = "address", source = "emailAddress")
Source toEntity(A a);
@Mapping(target = "address", source = "devices")
Source toEntity(B b);
@Mapping(target = "address", source = "mobileNumbers")
Source toEntity(C c);
default Base toDomain(Source source) {
if (source == null) {
return null;
} else if (condition to match to A) {
return toDomainA(source);
} else if (condition to match to B) {
return toDomainB(source);
} else if (condition to match to C) {
return toDomainC(source);
}
}
@Mapping(target = "emailAddress", source = "address")
A toDomainA(Source source);
@Mapping(target = "devices", source = "address")
B toDomainB(Source source);
@Mapping(target = "mobileNumbers", source = "address")
C toDomainB(Source source);
// This method is needed so MapStruct knows how to map from List<String> into String
static <T> String listToString(List<T> list) {
if (list == null) {
return null;
}
return list.toString();
}
// This method is needed so MapStruct know hot to map from String into List<String>
static List<String> fromListToString(String string) {
if (string == null) {
return null;
}
// Perform your own conversion
}
}