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

如何在Mapstruct集合映射器中使用修饰方法?

仉英朗
2023-03-14

我正在使用MapStruct从一个JPA实体映射到一个POJO DTO,在一个带有依赖项注入的Spring应用程序中。

@Override
public Set<DimensionItemTreeDTO> missionSetToTreeDtoSet(Set<Mission> set)  {
    return delegate.missionSetToTreeDtoSet( set );
}
@Override
public Set<DimensionItemTreeDTO> missionSetToTreeDtoSet(Set<Mission> set) {
    if ( set == null ) {
        return null;
    }

    Set<DimensionItemTreeDTO> set__ = new HashSet<DimensionItemTreeDTO>();
    for ( Mission mission : set ) {
        set__.add( missionToTreeDto( mission ) ); //here the decorator is not called !
    }

    return set__;
}

...并且从不为集合中的项调用修饰方法。

有没有一种方法可以让Mapstruct在集合映射中使用decorator方法,而不是在我的decorator中手动编写集合方法(这种方法很有效,但很冗长,并且违背了Mapstruct最初的目的,即不必编写这种代码)?

共有1个答案

姬英耀
2023-03-14

我找到了问题的解决方案:实际上,我的用例更适合MapStruct@AfterMapping方法,我使用了它,现在它对所有情况都很好地工作:

@Mapper
public abstract class ConstraintsPostProcessor {

    @Inject
    private UserService userService; // can use normal Spring DI here

    @AfterMapping
    public void setConstraintsOnMissionTreeDTO(Mission mission, @MappingTarget MissionDTO dto){ // do not forget the @MappingTarget annotation or it will not work
        dto.setUser(userService.getCurrentUser()); // can do any additional logic here, using services etc.
    }
}

在主映射器中:

@Mapper(uses = {ConstraintsPostProcessor.class}) // just add the previous class here in the uses attribute
public interface DimensionMapper {
    ...
}
 类似资料:
  • 按照第二个链接中包含的示例,我已经测试了: 但我没有实现使用。

  • 我想用Kotlin中的Mapstruct将实体映射到带有嵌套DTO的DTO。 在Java中,这是这样的:。 应该如何使用Kotlin实现它?

  • 我可以想象这样一个解决方案:一个子映射器,在这个映射器中,我用如下所示的查找重写Dto to Domain方法: 但目标在MapStruct中是必需的。也许我可以以某种方式指定整个对象作为目标?

  • 我目前正在用Spring componentModel设置一个MapStruct映射器,到目前为止一切都很好,各个子映射器可以按照预期进行自动注入。但是,在加载ApplicationContext时,使用修饰映射器会导致以下失败: 创建名为“Example MapperImpl”的bean时出错:通过构造函数参数0表示不满足的依赖关系;嵌套异常是org.springframework.beans.

  • 最后,我在我的映射类中使用了这个方法: 但这返回给我。我知道我的代码有问题,但我找不到适合我需要的有用的东西。你能帮我解决这个问题吗?

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