Использовать отображение метода обновления из другого картографа - PullRequest
1 голос
/ 14 июля 2020

У меня есть два Mappers

    @Mapper(uses= {ChildMapper.class})
    public abstract class ParentMapper {
        @Mappings...
        public abstract Parent dtoToParent(
                    final ParentDto dto);
                        
        @InheritConfiguration(name = "dtoToParent")
        public abstract Parent updateParentFromDto(
                final ParentDto dto,
                final @MappingTarget Parent parent);
    }
    
    @Mapper()
    public abstract class ChildMapper {
        Child dtoToChild(
                final ChildDto dto);
    
        Set<Child> dtosToChilds(
                final Set<ChildDto> childs);
    
        Child updateChildFromDto(
                final ChildDto dto,
                final @MappingTarget Child geo);
    }

Как мне указать MapStruct на использование метода updateChildFromDto внутри метода updateParentFromDto при создании реализации. Он генерируется с помощью dtosToChilds, который, в свою очередь, использует метод dtoToChild.

Причина, когда объект присутствует , я хочу обновить свойства, а не создавать новые, в то время как когда отсутствует, создать новый .

1 Ответ

1 голос
/ 24 июля 2020

Как MapStruct даже (в общем c способе) распознает, присутствует ли объект в целевом наборе?

Но ничто не мешает вам написать свою собственную реализацию для этого .. Что-то вроде это:


    @Mapper()
    public abstract class ChildMapper {

        abstract Child dtoToChild(ChildDto dto);
    
        abstract Child updateChildFromDto( ChildDto dto, @MappingTarget Child geo);

   
        Set<Child> dtosToChilds(final Set<ChildDto> childs);
    

        // NOTE the void, I don't like to return a mapping target. MapStruct calls
        // update methods from update methods an regular methods from regular methods
        // using both in one signature, things tend to get blurry 
        void updateDtosToChilds(Set<ChildDto> childs, @MappingTarget Set<Child> target){
            for ( ChildDto child : childs {           
               Child targetChild = null; 
               // get matching child from target
               if ( targetChild != null ) {            
                  updateChildFromDto( child, targetChild );
               }
               else {
                  target.add( dtoToChild( child ) );
               }

            }
        }
    
    }


и, как указано выше, не делайте:

        @InheritConfiguration(name = "dtoToParent")
        public abstract Parent updateParentFromDto(
                final ParentDto dto,
                final @MappingTarget Parent parent);

, а

        @InheritConfiguration(name = "dtoToParent")
        public abstract void updateParentFromDto(
                final ParentDto dto,
                final @MappingTarget Parent parent);
...