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

仅在表达式子句中使用另一个MapStruct映射器

钱繁
2023-03-14

我有一个映射器,对于目标类的特定属性,需要从源对象内的对象列表中选择一个,并使用不同的映射器类对其进行映射。

简化了很多,Game类包含一个Transaction对象列表,我的GameMapper类如下所示:

@Component
@Mapper(injectionStrategy = InjectionStrategy.CONSTRUCTOR, uses = {TransactionMapper.class, EventMapper.class})
public interface GameMapper {

@Mapping(target = "transaction", 
    expression = "java(transactionMapper.transactionToDto(findTransactionForPlayer(game, idPlayer)))")
GameResultDto gameToGameResultDto(Game game, Long idPlayer);

// Some more methods

}

问题是,EventMapper被生成为私有最终事件映射器EventMapper GameMapperImpl中的code>属性,但TransactionMapper不是,因此生成失败,因为MapStruct找不到TransactionMapper

我最好的猜测是,这是由于在GameMapper中没有其他方法显式地使用TransactionMapper,因此Mapstrt决定不需要它,并且没有在实现中注入它。

那么,是否有任何方法可以强制MapSTRt将映射器包含在use子句中,即使它们看起来没有被使用,或者有任何其他方法可以解决这个问题?

共有2个答案

杜诚
2023-03-14

我设法找到了一个棘手的解决办法。通过添加列表

不过,我仍然对非黑客解决方案持开放态度:)

方博
2023-03-14

我最好的猜测是,这是由于在GameMapper中没有其他方法显式地使用TransactionMapper,因此Mapstrt决定不需要它,并且没有在实现中注入它。

没错。如果MapStruct未使用映射程序,MapStruct将不会从映射程序#使用的中注入映射程序。

你可以使用一个抽象类。

例如

@Mapper(injectionStrategy = InjectionStrategy.CONSTRUCTOR, componentModel = "spring", uses = {TransactionMapper.class, EventMapper.class})
public abstract class GameMapper {

    @Autowired
    protected TransactionMapper transactionMapper;

    @Mapping(target = "transaction", 
        expression = "java(transactionMapper.transactionToDto(findTransactionForPlayer(game, idPlayer)))")
    public abstract GameResultDto gameToGameResultDto(Game game, Long idPlayer);

    // Some more methods

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

  • 我在我的项目中使用了mapstruct,它可以直接工作(所有的mapper都在一个包中)。现在我有了将一个映射器移动到另一个包的要求,但这并不能很好地工作。 你能帮我解决这个问题吗? 编辑包结构1的结果CarMapperImpl.java:

  • 我想把一个模型对象映射到dto模型。我已经有一个对象的映射器。我如何在另一个类中的另一个映射器中重用这个映射器? 我有下面的模型 这是我的地图 我希望将History映射到HistoryDynamo并重用IdentifierMapper映射HistoryDynamo中的一个对象。如何在ToHistoryDynamo中使用toIdentifierDynamo?

  • 我和mappstruct一起工作,我有一个问题,我不知道mapstruct是否能帮上忙。问题是我有一个DATA类。 和地址 和“人” @Mapper公共接口DataToPerson { }

  • 我最近开始使用mapstruct,在编码时我坚持使用一个场景。为了解决下面默认方法之间的模糊性,我试图在列表中使用“限定由” 但是第1行显示错误,因为需要指定“target”。我不确定这里的目标应该是什么,因为Line是一个集合对象。即使我不使用@mapping,mapstuct也会生成mapper实现。我阅读了mapstuct文档,但对这个场景了解不多。如何在列表上使用命名注释来明确表示这是要使

  • 这是我的例子。 我希望toDto方法使用toDto将Employee映射到EmployeeDto,但mapstruct会生成employeeDtoToEmployeeDto方法。我该怎么修? 谢谢