嵌套源和嵌套目标属性的MapStruct错误

时间:2016-11-17 04:23:38

标签: java spring 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.

如果我有Set

怎么办?

来源 -

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)".`

2 个答案:

答案 0 :(得分:0)

目前,MapStruct不支持嵌套属性的自动映射。为了使您的映射生效,您需要为CategoriesMapper提供另外一种方法:

RegionsDTO regionsToRegionsDTO(Regions Regions); 

目前有一个未解决的问题(#60)和待定的PR(#937)正在寻求解决此新功能。

答案 1 :(得分:0)

我相信最干净的方法是编写一个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遇到了类似的问题。