public class SourceA {
private Integer amount;
private Date date;
// Getters and setters.
}
public class TargetA {
private Integer amount;
private Date date;
// Formatting logic done by mapperB.
private String amountFormatted;
private String dateFormatted;
// Getters and setters.
}
public class TargetB {
private String amountFormatted;
private String dateFormatted;
// Getters and setters.
}
@Mapper
public abstract class MapperA {
public abstract TargetA sourceToTarget(SourceA sourceA);
@AfterMapping
void logic1(SourceA sourceA, @MappingTarget targetA) {...}
@AfterMapping
void logic2(SourceA sourceA, @MappingTarget targetA) {...}
}
// 1. This way I have ambiguous dependency exception when injecting MapperA, e.g.
// @Inject MapperA mapperA;
// because of mapper implementations MapperAImpl, MapperBImpl.
// I tried using @Qualifier, but it is not added for implementation classes.
@Mapper(uses = {AmountMapper.class, DateMapper.class})
public abstract class MapperB extends MapperA {
@AfterMapping
void logicFormatted(@MappingTarget targetA) {
targetA.amountFormatted = amountFormat();
targetA.dateFormatted = dateFormat();
}
}
// 2. This way all the custom logic for MapperB is applied before MapperA has prepared data with it's custom logic and each mapper creates own TargetA object.
@Mapper(uses = MapperA.class)
public abstract class MapperB {
public abstract TargetA sourceToTarget(SourceA sourceA);
@AfterMapping
void logicFormatted(SourceA sourceA, @MappingTarget targetA) {...}
}