为什么这个MapStruct生成的类没有包含导入语句?

9

我正在使用MapStruct来映射JPA实体和POJO DTO之间的关系。

我的所有实体都扩展了一个具有ID字段(一个java.lang.Long)的共同基类。

我有以下抽象映射器,它允许我将JPA中的关系映射到DTO中的简单Long字段(或列表)。

实体或List<entity>字段可以映射到Long/List<Long>字段,例如User.groups可以映射到UserDTO.groupIds

@Mapper
public abstract class EntityMapper {

    public Long entityToLongId(AbstractBaseEntity entity){
        return entity.getId();
    }

    public abstract List<Long> entityCollectionToLongIdList(Collection<? extends AbstractBaseEntity> entities);
}

然而,生成的实现类并没有包含AbstractBaseEntity类的任何导入语句,尽管它在抽象类中存在,所以代码无法编译:

package ....;

import java.util.ArrayList;
import java.util.Collection;
import java.util.List;
import javax.annotation.Generated;
import org.springframework.stereotype.Component;

@Generated(
    value = "org.mapstruct.ap.MappingProcessor",
    date = "2016-07-27T12:11:25+0200",
    comments = "version: 1.0.0.Final, compiler: javac, environment: Java 1.8.0_66 (Oracle Corporation)"
)
@Component
public class EntityMapperImpl extends EntityMapper {

    @Override
    public List<Long> entityCollectionToLongIdList(Collection<? extends ch.unine.tango.model.AbstractBaseEntity> entities) {
        if ( entities == null ) {
            return null;
        }

        List<Long> list = new ArrayList<Long>();
        for ( AbstractBaseEntity abstractBaseEntity : entities ) { // compilation error here !
            list.add( entityToLongId( abstractBaseEntity ) );
        }

        return list;
    }
}

为什么会这样?我做错了吗?如何解决?
我正在使用Java 8的MapStruct 1.0.0.Final版本。
编辑:如果我添加一个直接使用AbstractBaseEntity类的抽象方法,那么导入就会被添加:
public abstract AbstractBaseEntityDTO entityToDTO(AbstractBaseEntity abstractBaseEntity); 

编辑2:在MapStruct的Github上发布了该问题:https://github.com/mapstruct/mapstruct/issues/844

3个回答

37

当在MapStruct中缺少导入时,注意您可以手动配置Mapper来导入它:

@Mapper( imports = AbstractBaseEntity.class )

MapStruct文档中搜索“声明导入”(示例72,此时为Mapstruct 1.4.1.Final版本)。


1
文档更新:请参阅表达式示例72。 - DBK

1
根据yunandtidus的正确说法,你可以这样解决它:
@Mapper( imports = AbstractBaseEntity.class )

补充一下他的回答,如果你需要导入多个类,只需将它们用花括号括起来即可:
@Mapper( imports = {AbstractBaseEntity.class, MyOtherCoolClass.class} )

0

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接