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

Mapstruct——如何在生成的Mapper类中注入spring依赖项

单于海荣
2023-03-14

我需要在生成的mapper实现中注入一个spring服务类,以便通过

   @Mapping(target="x", expression="java(myservice.findById(id))")"

这是否适用于Mapstruct-1.0?

共有3个答案

沈德寿
2023-03-14

由于1.2,这可以通过@AfterMapping和@Context的组合来解决。。这样地:

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

   @Mapping(target="x",ignore = true)
   // other mappings
   Target map( Source source, @Context MyService service);

   @AfterMapping
   default void map( @MappingTarget Target.X target, Source.ID source, @Context MyService service) {
        target.set( service.findById( source.getId() ) );
   }
 }

服务可以作为上下文传递。

一个更好的解决方案是使用一个@Context类来包装MyService,而不是直接传递MyService。可以在这个“上下文”类上实现@AfterMapping方法:无效映射(@MappingTarget.X Target,Source.ID Source)保持映射逻辑与查找逻辑之间的距离。在MapStruct示例存储库中签出此示例。

罗星洲
2023-03-14

如果您将Spring声明为组件模型并添加对myservice类型的引用,这应该是可能的:

@Mapper(componentModel="spring", uses=MyService.class)
public interface MyMapper { ... }

该机制旨在提供对生成代码调用的其他映射方法的访问,但您也应该能够以这种方式在表达式中使用它们。只需确保您在服务引用中使用生成字段的正确名称。

谢鸿羲
2023-03-14

正如brettanomyces所评论的,如果服务不用于表达式以外的映射操作,则不会注入该服务。

我发现的唯一方法是:

  • 将我的mapper接口转换为抽象类

我正在使用CDI,但它应该是带有Spring的samel:

@Mapper(
        unmappedTargetPolicy = org.mapstruct.ReportingPolicy.IGNORE,
        componentModel = "spring",
        uses = {
            // My other mappers...
        })
public abstract class MyMapper {

    @Autowired
    protected MyService myService;

    @Mappings({
        @Mapping(target="x", expression="java(myservice.findById(obj.getId())))")
    })
    public abstract Dto myMappingMethod(Object obj);

}
 类似资料:
  • 问题内容: 我需要使用spring框架在抽象超类中注入依赖项。 我每次实例化Abstract class B时都需要传递超类依赖关系(可以在我的项目中以100多种方式将其子类化) application.xml(Spring上下文文件)中的条目 我如何才能在application.xml中创建超类AbstractClassB的bean引用,以便可以在所有子类bean创建中使用它? 问题答案: 你可

  • 我尝试用Spring-Boot创建一个spring web应用程序。我的第一个问题是依赖注入对我不起作用。这是我跟踪的那篇文章。 我创建了一个应用程序类: 我的分级文件: 我所期望的:当我打开/greeting页面时,将出现log,但我在的开头得到了这一点: 2017-09-12 10:47:56.058警告7545--[main]ConfigEmbeddedWebApplicationConte

  • 我有什么似乎是一个简单的问题,关于如何设置Jenkins和maven 3。 为了简单起见,假设我们有四个项目: 没有依赖关系的模型 Commons依赖于模型 服务器依赖于Common和模型 前端依赖于模型 我想要实现的是,一个成功的基于模型的构建触发所有项目的新构建,这些项目在其pom中依赖于模型(这里是公共的,服务器和前端) 如果Common失败,则无需构建服务器。 在上述情况下,我似乎可以通过

  • 我正在编写一个应用程序,该应用程序与一个数据库通信,获取其他数据库的凭据,并连接到其他数据库。它使用在运行时构造的数据源和实体管理器工厂来执行此操作。 如果我想使用Spring Data Repositories,我想我需要自动连接它们,因此它们必须是Spring Beans。 如果在对第一个数据库运行查询之前没有构造的DataSource,我如何使用Spring Data?

  • 谢谢你。 更新:我找到了另一个解决方案,并在另一个帖子中发布了答案:https://stackoverflow.com/a/52021965/2580829

  • 我做了一个名为AcessoCliente的单例类 但我需要对我的单例类执行一个名为ValidadorNivelDeAcessoBusiness的类的依赖注入