当前位置: 首页 > 知识库问答 >
问题:

在mapstruct映射器中实现自定义行为的问题

太叔逸春
2023-03-14

我有以下DTO类:

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

    private Integer id;
    // ......
    private List<CType> cTypes;
}

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

    private Integer id;
    // ......
    private VType vType;
}
@Getter
@Setter
@NoArgsConstructor
@AllArgsConstructor
@Entity
@Table(name = "conclusion")
public class Conclusion {

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

    // ......

    @OneToMany
    @JoinColumn(name = "id")
    private List<CTypeEntity> cTypeEntities;
}

@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;
}
@Mapper
public interface ConclusionMapper {

    @Mappings({
            @Mapping(target = "cTypes", source = "cTypeEntities")
    })
    Conclusion toConclusion(ConclusionEntity entity);

    List<Conclusion> toConclusionList(List<ConclusionEntity> entities);

    @Mappings({
            @Mapping(target = "cTypeEntities", source = "cTypes")
    })
    ConclusionEntity fromConclusion(Conclusion conclusion);

    List<ConclusionEntity> fromConclusionList(List<Conclusion> conclusions);

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

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

    CTypeEntity fromCType(CType cType);

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

    @Named("formVType")
    default VType formVType(CTypeEntity entity) {
        // TODO: instantiate a DAO which will return an instance of VType
        VTypeDao dao; // instantiate somehow

        return vTypeDao.findById(entity.getVId()); 
    }
}

VTypeDao看起来是这样的:

public interface VTypeDao {
    VType findById(int id);

    boolean exists(int id);

    List<VType> findAll();
}

@Component
public class VTypeDaoImpl implements VTypeDao {
    private final VTypeRepo vTypeRepo;

    public VTypeDaoImpl(VTypeRepo vTypeRepo) {
        this.vTypeRepo = vTypeRepo;
    }

    // ............................. method implementations
}

我的问题是:如何实例化VTypeDao的对象(或者至少是VTypeRepo,这样我就可以将if作为参数传递给VTypeDaoImpl)?

没有工厂类来获得VTypeDao的适当实现。

编辑:VTypeDao及其实现是我的项目的第三方组件。

共有1个答案

欧阳勇军
2023-03-14

从您的评论中,我发现您希望在映射过程中对VTypeDao进行查找。您可以将其包装在另一个类中,并将其作为@Context(注释为映射参数)提交。MapStruct不会将此类类视为源或目标。但是,它将在该类中调用生命周期方法。请看一下这个示例:https://github.com/mapstruct/mapstruct-examples/tree/master/mapstruct-jpa-child-parent/src。

它是基于jpa的,但是您可以很容易地将它映射到您的问题…

 类似资料:
  • 例如,我有以下接口映射器: 在代码中,您可以看到映射和一些默认方法,其中包含其他映射。如何在Mapstruct映射中使用这些方法,以便Mapstruct使用这些方法在字段中填充值?

  • 以下是我的上下文:我使用byteBuddy动态生成一个类,该类根据外部配置将一个对象转换为另一个对象。我遇到了一些问题,我想找到一个替代方案,这就是我发现MapStruct的方式。 因此,我试图构建简单的映射器,我想知道是否有可能自定义注释以添加转换函数。例如,我想要: 在mapper实现中,我会有如下内容: 如果有人能帮我做到这一点,我将不胜感激,这将节省我很多时间。 提前谢谢。

  • 我有一个映射定义为 其中定义如下: 反向映射是使用处理的。如何为反向映射指定自定义映射?

  • 我试图找到一个更好的解决方案,以防止Hibernate代理初始化时,通过MapSTRt将实体映射到响应DTO。 我一直在将我们的代码库转换为使用ModelMapper中的MapStruct。如果我想用ModelMapper完成我的要求,我可以做如下简单的事情: 自定义getter方法允许我检查是否已经从数据库中获取了字段,以避免N 1次初始化。 它看起来像: 我不能简单地覆盖普通的getter,因

  • 注意:我的jar是一个用Warbler编译成jar的jruby文件。

  • 我有一个简单的Java单模块Gradle项目,其中我使用Mapstruct进行Java映射。我的如下所示: 我的源文件夹包含以下Java源代码: