【问题标题】:Why does this MapStruct generated class does not include import statement?为什么这个 MapStruct 生成的类不包含 import 语句?
【发布时间】:2016-12-01 07:22:48
【问题描述】:

我正在使用 MapStruct 在 JPA 实体和 POJO DTO 之间进行映射。

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

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

实体或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;
    }
}

这是为什么呢?我做错了吗?如何解决这个问题?

我正在使用 MapStruct 1.0.0.Final 和 Java 8。

编辑:如果我添加了一个直接使用AbstractBaseEntity 类的抽象方法,则添加了导入:

public abstract AbstractBaseEntityDTO entityToDTO(AbstractBaseEntity abstractBaseEntity); 

EDIT2:在 MapStruct 的 Github 上发布问题:https://github.com/mapstruct/mapstruct/issues/844

【问题讨论】:

    标签: java mapping dto mapstruct


    【解决方案1】:

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

    @Mapper( imports = AbstractBaseEntity.class )
    

    MapStruct documentation中搜索“声明导入”

    (编辑时的示例 72:Mapstruct 1.4.1.Final)

    【讨论】:

    【解决方案2】:

    这是 MapStruct 1.0.0 中的一个错误。它(将)在(在撰写本文时,即将发布的)1.1.0 版中得到修复。

    见:https://github.com/mapstruct/mapstruct/issues/844

    【讨论】:

      猜你喜欢
      • 2020-04-26
      • 2018-05-29
      • 1970-01-01
      • 2021-06-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-01-11
      相关资源
      最近更新 更多