自动生成的实现中不使用mapstruct中按名称限定的方法

时间:2019-08-02 11:03:03

标签: java spring spring-boot spring-data-jpa mapstruct

我有以下DTO和Entity类:

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
public class CType {

    private Integer id;
    // ......
    private VType vType;
}

@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "c_types")
public class CTypeEntity {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    @Column(name = "id", nullable = false, updatable = false)
    private Integer id;

    // ......

    @Column(name = "v_type_id")
    private Integer vTypeId;
}

我需要使用 mapstruct 映射这些类的对象,这是我的 mapstruct

@Mapper
public interface VCMapper {

    @Mappings({
            @Mapping(target = "cType", qualifiedByName = "formVType")
    })
    CType toCType(CTypeEntity cTypeEntity);

    List<CType> toCTypes(List<CTypeEntity> cTypeEntities);

    @Mappings({
            @Mapping(target = "vTypeId", source = "vType.id")
    })
    CTypeEntity fromCType(CType cType);

    List<CTypeEntity> fromCTypeList(List<CType> cTypes);

    @Named("formVType")
    default VType formVType(CTypeEntity entity, @Context VTypeDao vTypeDao) {
        return vTypeDao.findById(entity.getVId()); 
    }
}

问题::当我使用Maven(mvn clean package)构建应用程序时,自动生成的toCType()类中的方法VCMapperImpl的实现没有实现使用合格的formVType()默认方法。

问题:

  • 为什么impl类中没有使用合格的默认方法?
  • 默认方法有什么问题,它在Mapper界面中的用法以及如何解决?

1 个答案:

答案 0 :(得分:1)

之所以不使用合格的formVType方法,是因为@Context属性。原始方法中没有这样的属性,因此MapStruct将不匹配该方法。如果将其添加到toCType,则将使用它。

为了不拖拉VTypeDao,建议您使用abstract类并将其注入其中。

例如

@Mapper
public abstract class VCMapper {

    protected VTypeDao vTypeDao;

    @Mappings({
            @Mapping(target = "cType", qualifiedByName = "formVType")
    })
    public abstract CType toCType(CTypeEntity cTypeEntity);

    public abstract List<CType> toCTypes(List<CTypeEntity> cTypeEntities);

    @Mappings({
            @Mapping(target = "vTypeId", source = "vType.id")
    })
    public abstract CTypeEntity fromCType(CType cType);

    public abstract List<CTypeEntity> fromCTypeList(List<CType> cTypes);

    @Named("formVType")
    protected VType formVType(CTypeEntity entity) {
        return vTypeDao.findById(entity.getVId()); 
    }

    public void setVTypeDao(VTypeDao vTypeDao) {
        this.vTypeDao = vTypeDao
    }
}