MapStruct: как пропустить конкретное свойство от копирования, если свойство находится внутри коллекции, а коллекция находится внутри основного объекта - PullRequest
0 голосов
/ 03 июля 2019

Я обновляю существующий компонент, используя mapstruct. Ниже мои бобы. Как вы можете видеть, у моего bean-компонента Entity есть коллекция bean-компонента AnotherEntity.

public class Entity
{
private Integer id;
private String name;
private List<AnotherEntity> anotherEntityList = new ArrayList<AnotherEntity>();
//getters & setters
}

public class AnotherEntity
{
private Integer id;
private String text;
//getters & setters
}

Ниже показано, как я определил отображение.

Entity updateEntityWithEntity(final Entity sourceEntity, @MappingTarget final Entity targetEntity);

После обновления я хочу, чтобы mapstruct пропустил свойство id в бине AnotherEntity. В настоящее время он очищает существующую коллекцию и создает новую коллекцию со значениями из источника.

Если я добавлю ниже

@Mapping(target = "anotherEntityList", ignore = true) игнорирует всю коллекцию. Но я хочу коллекцию, но игнорирую только свойство id. Что-то вроде этого. @Mapping(target = "anotherEntityList.id", ignore = true)

Любая помощь приветствуется!

1 Ответ

1 голос
/ 06 июля 2019

MapStruct не может создать отображение списка.Он не знал бы, что пользователь на самом деле намерен.Посмотрите на this для более подробного объяснения.

Но предположим, что оба списка упорядочены, и что элемент 0 должен быть сопоставлен с целевым элементом 0, 1 к 1 и т. Д.

Вы можете сделать что-то вроде этого:

@Mapper
public interface MyMapper{

// you probably don't need the return, right?
void updateEntityWithEntity(Entity sourceEntity, @MappingTarget Entity targetEntity);

// you need to implement the list merging yourself.. MapStruct has no clue what you intent here
default updateList( List< AnotherEntity > sourceList, @MappingTarget List< AnotherEntity> targetList ) {
   for ( int i=0; i<sourceList.size(); i++ ) {
        updateAnotherEntityWithAnotherEntity( sourceList.get( i ), targetList.get( i ) );
   }
}

// used by above code in 
@Mapping( target = "id", ignore = true )
void updateAnotherEntityWithAnotherEntity(AnotherEntity sourceEntity, @MappingTarget AnotherEntity targetEntity);


}

...