I'm using new feature in mapstruct to map hierarchy of classes. And now I need to write rest PUT for update. But it actually not updating fields of subclasses, and I could not apply any mapping ignores for subclasses.
@Mapper
public interface FruitMapper {
@SubclassMapping(target = AppleEntity.class, source = AppleDto.class )
@SubclassMapping(target = BananaEntity.class, source = BananaDto.class)
FruitEntity map(FruitDto source);
@Mapping(target = "id", ignore = true)
@Mapping(target = "createdDate", ignore = true)
void put(@MappingTarget FruitEntity target, FruitEntity input);
@Mapping(target = "country", ignore = true)
void put(@MappingTarget BananaEntity target, BananaEntity input);
}
UPD: my straight-forward solution is currently with lombok to make deep copy
// add this method to mapper class, and provide method for each subclass
default void performPut(FruitEntity target, FruitEntity input) {
put(target, input);
var targetBackup = target.toBuilder().build();
if (target instanceof AppleEntity) {
put((AppleEntity) target, (AppleEntity) input);
} else if (target instanceof BananaEntity) {
put((BananaEntity) target, (BananaEntity) input);
}
target.setId(targetBackup.getId());
target.setCreatedDate(targetBackup.getCreatedDate());
}