ModelMapper неправильно отображает свойство вложенного объекта - PullRequest
1 голос
/ 04 ноября 2019

Я использую ModelMapper для сопоставления DTO с сущностями и наоборот. У меня проблема, когда я сопоставляю ChildDTO с Child, где и класс Child, и класс Parent имеют свойство с одинаковым именем.

Это объекты:

public class Child {

    @Id
    @EqualsAndHashCode.Include
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    private String name; // <---- property called 'name'
    // other properties

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "parent_id")
    private Parent parent;
}

public class Parent {

    @Id
    @EqualsAndHashCode.Include
    @GeneratedValue(strategy= GenerationType.IDENTITY)
    private Long id;

    private String name; // <---- property called 'name'
    // other properties

    @OneToMany(mappedBy = "parent", cascade = CascadeType.ALL, orphanRemoval = true)
    private List<Child> items = new ArrayList<>();
}

public class ChildDTO {

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Long id;

    private String name;
    // other properties

    @JsonProperty(access = JsonProperty.Access.READ_ONLY)
    private Long parentId;
}

А вот код, который выполняет сопоставление:

ModelMapper modelMapper = new ModelMapper();
modelMapper.getConfiguration().setPropertyCondition(Conditions.isNotNull());
modelMapper.getConfiguration().setAmbiguityIgnored(true);
modelMapper.getConfiguration().setMatchingStrategy(MatchingStrategies.STRICT);

Child childItem = repository.findById(id);

ChildDTO childItemDTO = new ChildDTO();
childItemDTO.setName("new name");

modelMapper.map(childItemDTO, childItem);

В результате оба Child::name и Parent::name изменить на «новое имя». Обратите внимание, что я уже использую стратегию отображения STRICT.

Я также не смог найти способ пропустить вызов Parent::setName() при отображении с ChildDTO на Child

Версия ModelMapper: 2.3.2

...