为什么生成的这个 MapStruct class 不包含 import 语句?
Why does this MapStruct generated class does not include import statement?
我正在使用 MapStruct 在 JPA 实体和 POJO DTO 之间进行映射。
我所有的实体都扩展了一个公共基础 class,它有一个 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);
}
然而,生成的实现 class 不包含 AbstractBaseEntity
class 的任何导入语句,尽管它存在于摘要 class 中,因此代码确实不编译:
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
class 的抽象方法,则添加导入:
public abstract AbstractBaseEntityDTO entityToDTO(AbstractBaseEntity abstractBaseEntity);
EDIT2:在 MapStruct 的 Github 上发布了问题:https://github.com/mapstruct/mapstruct/issues/844
这是 MapStruct 1.0.0 中的错误。它已(将)固定在(在撰写本文时,即将发布的)版本 1.1.0 中。
当缺少使用 MapStruct 的导入时,请注意您可以手动配置 Mapper 来导入它:
@Mapper( imports = AbstractBaseEntity.class )
中搜索“声明导入”
(本次编辑时的示例 72:Mapstruct 1.4.1.Final)
我正在使用 MapStruct 在 JPA 实体和 POJO DTO 之间进行映射。
我所有的实体都扩展了一个公共基础 class,它有一个 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);
}
然而,生成的实现 class 不包含 AbstractBaseEntity
class 的任何导入语句,尽管它存在于摘要 class 中,因此代码确实不编译:
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
class 的抽象方法,则添加导入:
public abstract AbstractBaseEntityDTO entityToDTO(AbstractBaseEntity abstractBaseEntity);
EDIT2:在 MapStruct 的 Github 上发布了问题:https://github.com/mapstruct/mapstruct/issues/844
这是 MapStruct 1.0.0 中的错误。它已(将)固定在(在撰写本文时,即将发布的)版本 1.1.0 中。
当缺少使用 MapStruct 的导入时,请注意您可以手动配置 Mapper 来导入它:
@Mapper( imports = AbstractBaseEntity.class )
中搜索“声明导入”
(本次编辑时的示例 72:Mapstruct 1.4.1.Final)