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

MapStruct指定子映射

公宜春
2023-03-14

这是我的例子。

public class Company {
    ....
    private String companyName;
    ....
}

public class Employee {
    ....
    private String name;
    ....
}

public class EmployeeDto {
    ....
    private String name;
    private String companyName;
    ....
}

@Mapper(componentModel = "spring")
public interface EmployeeDtoMapper {

    @Mapping(target = "name", source = "source1.name")
    @Mapping(target = "companyName", source = "source2.companyName")
    EmployeeDto toDto(Employee source1, Company source2);

    List<EmployeeDto> toDtos(List<Employee> sources, @Context Company source2);

}

我希望toDto方法使用toDto将Employee映射到EmployeeDto,但mapstruct会生成employeeDtoToEmployeeDto方法。我该怎么修?

谢谢

共有1个答案

任长卿
2023-03-14

Mapstruct仅允许基于1个源和1个目标选择子映射。因此有了@Context注释。这将有效地忽略该参数,只将其传递给子映射。。

但是...你可以这样解决你的问题...

@Mapper(componentModel = "spring")
public interface EmployeeDtoMapper {

    @Mapping(target = "name", source = "source1.name")
    EmployeeDto toDto(Employee source1, @Context Company source2);

    @AfterMapping
    default afterToDto(@MappingTarget EmployeeDto target, @Context Company source2) {
       target.setCompanyName( source2.getCompanyName();
    }

    List<EmployeeDto> toDtos(List<Employee> sources, @Context Company source2);

}

注意:如果您在mapping source2中有多个参数,并且您也喜欢使用MapStruct,那么您可以定义一个新的接口方法mappingEmploydTodo(Company source),并从默认方法调用它。

 类似资料:
  • 我有简单的对象客户端

  • 问题内容: 如果名称和名称相同,默认情况下MapStruct将映射源和目标的所有属性。尽管我们可以在@Mapping中使用ignore属性来省略任何字段映射。但这不是我想要的。我想控制映射策略。我必须指定类似 现在此映射仅用于将ID和名称从源映射到目标。除非在映射注释中指定,否则不应映射其他字段。 问题答案: 您正在寻找的是#1392中 的功能请求。有一个待定的PR,因此可以在下一版本(1.3.0

  • 默认情况下,MapStruct映射源和目标的所有属性,如果它们具有相同的名称。中的元素可用于省略任何字段映射。但那不是我想要的。我想控制映射策略。我想指定如下内容: 现在,这个映射仅仅意味着将id和名称从源映射到目的地。除非在mappings注释中指定,否则不应映射其他字段。

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

  • 我有一个mapstruct类,具有以下函数 CustomApplication和常规应用程序都扩展了App,因此我有根据isCustom字段调用转换器的main Converter。 问题是,当我尝试构建这个时,我得到了一个模糊的映射错误,因为main Converter、ConvertNorarApplication和ConvertCustomApplication都从Application D

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