Ошибка MapStruct с вложенными исходными и вложенными целевыми свойствами

Я использую mapstruct для преобразования домена в DTO ниже, используется сопоставление: -

   @Mapper(componentModel = "spring", uses = {})
   public interface CategoriesMapper {
      @Mapping(source = "regionsid.id", target = "regionsid.id")
      CategoriesDTO categoriesToCategoriesDTO(Categories categories);  
   } 

    public class Categories implements Serializable {
        private Regions regionsid;
        public Regions getRegionsid() {
            return regionsid;
        }

        public void setRegionsid(Regions regions) {
            this.regionsid = regions;
        }

    }

    public class CategoriesDTO implements Serializable {
        private RegionsDTO regionsid;
        public RegionsDTO getRegionsid() {
            return regionsid;
        }

        public void setRegionsid(RegionsDTO regions) {
            this.regionsid = regions;
        }

    }

    public class Regions implements Serializable {
        private Long id;
    }

    public class RegionsDTO implements Serializable {
        private Long id;
    }

Итак, у меня есть некоторая структура как на исходной, так и на целевой стороне, но я получаю ошибку ниже: -

CategoriesMapper.java:28: error: Unknown property "regionsid.id" in return type.

что, если у меня установлен

Источник -

private Set<Regions> regions = new HashSet<>();

Цель -

private Set<RegionsDTO> regions = new HashSet<>();

CategoriesMapper.java:36: error: Can't map property "java.util.Set<com.equidity.xboard.service.dto.RegionsDTO> regions" to "java.util.Set<com.equidity.xboard.domain.Regions> regions". Consider to declare/implement a mapping method: "java.util.Set<com.equidity.xboard.domain.Regions> map(java.util.Set<com.equidity.xboard.service.dto.RegionsDTO> value)".`

person Anchit Pancholi    schedule 17.11.2016    source источник


Ответы (2)


В настоящее время MapStruct не поддерживает автоматическое сопоставление вложенных свойств. Чтобы ваше отображение работало, вам нужно будет предоставить вашему CategoriesMapper еще один метод:

RegionsDTO regionsToRegionsDTO(Regions Regions); 

В настоящее время существует нерешенная проблема (# 60) и ожидающий PR (# 937), которые хотят использовать эту новую функцию.

person Filip    schedule 02.12.2016

Я считаю, что самый чистый способ сделать это - написать интерфейс RegionsMapper, примерно такой:

@Mapper(componentModel = "spring", uses = {})
public interface RegionsMapper extends EntityMapper<RegionsDTO, Regions> {

    Set<Regions> map(Set<RegionsDTO> value);
}

Обратите внимание, что в приведенном выше коде объявляется метод, запрашиваемый в сообщении об ошибке.

Кроме того, вам также нужно будет настроить аннотацию @Mapper (первая строка кода в вопросе), чтобы она использовала этот новый сопоставитель:

@Mapper(componentModel = "spring", uses = {RegionsMapper})

Этот вопрос немного старый, но я только что столкнулся с чем-то очень похожим, используя JHipster.

person Adam Wise    schedule 01.10.2018