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

使用带有mapstruct的自定义映射器进行反向映射

翁俊良
2023-03-14

我有一个映射定义为

@Mapping(source = "diagnoses", target = "diagnosisCode", qualifiedByName = "mapDiagnosisCodeAsList")

其中MapDiagnosisCodeAsList定义如下:

@Named("mapDiagnosisCodeAsList")
default List<String> retrieveDiagnosisCodeAsList(List<Diagnosis> aList) {
    if (CollectionUtils.isEmpty(aList)) {
        return new ArrayList<>();
    }
    return aList.stream().map(Diagnosis::getDiagnosisCode).collect(Collectors.toList());
}

反向映射是使用@inheritinverseconfiguration处理的。如何为反向映射指定自定义映射?

共有1个答案

祁英哲
2023-03-14

为了使反向映射工作,您还需要提供反向方法。

@Named("mapDiagnosisCodeAsList")
default List<Diagnosis> retrieveDiagnosisCodeAsList(List<String> aList) {
    if (CollectionUtils.isEmpty(aList)) {
        return new ArrayList<>();
    }
    return aList.stream().map(Diagnosis::new).collect(Collectors.toList());
}

另一个附注。我认为你并不需要修饰符的复杂性来实现这一点。如果您只有一个诊断字符串和反向,那么您可以在没有限定符的情况下(甚至没有列表)执行此操作。

您的@mapping在没有qualifiedbyname的情况下将保持不变,您需要提供从诊断字符串和反向的映射。

default String diagnosisToString(Diagnosis diagnosis) {
    return diagnosis == null ? null : diagnosis.getDiagnosisCode();
}

default Diagnosis stringToDiagnosis(String diagnosisCode) {
    return diagnosis == null ? null : new Diagnosis(diagnosisCode);
}

集合的创建将由MapStruct负责。另外,我假设diagnost有一个接受代码的构造函数。

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

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

  • 我有两个对象,除了date成员外,其他成员都相同。在obj1中,date是java.sql.date,obj2.date是long(纪元)。 我需要编写一个映射器来将obj1映射到obj2。这就是我试图做的: 但是mapperImpl只有自己的日期转换实现: 我得到了: 这种转换的正确方式是什么?

  • 从数据传输对象(DTO)到具有双向一对多关联的Hibernate实体执行MapStruct映射的最佳方法是什么? 假设我们有一个,其中链接了多个类型为的评论: 相应的Hibernate实体<代码>书籍<代码>与<代码>评论<代码>有一对多关联: 请注意,本书的方法还通过调用来双向设置关联,这是Hibernate专家推荐的(例如,Thorben Janssen的“Hibernate Tips:如何映

  • 下面的例子中,我有一个单独的域层和一个单独的持久层。我使用Mapstruct进行映射,当从域映射到实体或从实体映射到域时,会出现堆栈溢出,因为双向引用总是被调用- 用于映射的类非常基本

  • 是否可能在MapStruct中使用不同的映射器?我有这个映射器 是否可以将此实现更改为MapStruct?