Mapstruct mappingTarget with subclasses

Viewed 236

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());
    }
0 Answers
Related