Jhipster 如何修复不明确的映射方法

Jhipster 如何修复不明确的映射方法,jhipster,mapstruct,Jhipster,Mapstruct,我正在用杰普斯特做一个实验 我创建了两个由DTO(mapstruct)支持的实体A和B。 他们之间有一种多对多的关系。 它们都与用户有多对一的关系 在建立最后一段关系之前,一切都很顺利。 创建最后一个多对一关系后,出现以下错误: [INFO] --- maven-processor-plugin:2.2.4:process (process) @ m2m --- [ERROR] diagnostic: /Users/andy/jhipster-m2m/src/main/java/com/m2m/

我正在用杰普斯特做一个实验

我创建了两个由DTO(mapstruct)支持的实体A和B。 他们之间有一种多对多的关系。 它们都与用户有多对一的关系

在建立最后一段关系之前,一切都很顺利。 创建最后一个多对一关系后,出现以下错误:

[INFO] --- maven-processor-plugin:2.2.4:process (process) @ m2m ---
[ERROR] diagnostic: /Users/andy/jhipster-m2m/src/main/java/com/m2m/web/rest/mapper/AMapper.java:18: error: Ambiguous mapping methods found for mapping property "java.lang.Long userId" to com.m2m.domain.User: com.m2m.domain.User userFromId(java.lang.Long id), com.m2m.domain.User com.m2m.web.rest.mapper.BMapper.userFromId(java.lang.Long id).
A aDTOToA(ADTO aDTO);
  ^
[ERROR] error on execute: error during compilation
定义非常简单: 例如:

}

对于B:

{
"relationships": [
    {
        "relationshipId": 1,
        "relationshipName": "a",
        "otherEntityName": "a",
        "relationshipType": "many-to-many",
        "ownerSide": false,
        "otherEntityRelationshipName": "b"
    },
    {
        "relationshipId": 2,
        "relationshipName": "user",
        "otherEntityName": "user",
        "relationshipType": "many-to-one",
        "otherEntityField": "id"
    }
],
"fields": [
    {
        "fieldId": 1,
        "fieldName": "nameB",
        "fieldType": "String"
    }
],
"changelogDate": "20150909165433",
"dto": "mapstruct",
"pagination": "no"
}

我真的被这件事缠住了。 非常感谢您的帮助


编辑:提供github repo来演示问题

正如上面评论中提到的,这似乎是一个bug。目前,您可以从一个映射器中删除该方法,也可以在任何一个映射器中重命名该方法,我们需要研究如何在Jhipster中生成时避免这种情况


这也可以通过使用MapStruct限定符(请参见参考文档中的)来修复。

这似乎是一个bug,但与上面提到的不同。JHipster映射器生成器未将@mapper(…,users={UserMapper.class})正确添加到映射器类。我在一年后回答这个问题,因为JHipster 3.12.2仍然是这样

在共享的源中,替换以下行:

@Mapper(componentModel = "spring", uses = {BMapper.class, })
为此:

@Mapper(componentModel = "spring", uses = {BMapper.class, UserMapper.class})

为什么有两种从id映射到用户的方法?他们有什么不同?嗨,古纳,谢谢你的反馈。顺便说一句,没有两种方法可以将id映射到用户,至少不在同一个对象中。实体A需要知道其所有者,B也需要知道,但它们是不同的对象。我将在github上发布这个示例,并编辑该帖子,以便友好的助手可以查看它。您是否手动更改了任何内容?if not看起来像是我们用mapstruct生成的一个bug。当mapstruct试图将userID从DTO映射到User中的id时,它看到两个方法
userFromId
正在执行该功能,一个在AMapper中,另一个在BMapperHaven中,没有任何更改。在我看来,AMapper和BMapper是不相关的,因此映射不应该是模糊的。仅供参考,这个问题只发生在多对多关系中,所以一定有某种关联(没有双关语的意思;))嗨,Deepu,希望我能更好地了解mapstruct的工作原理。我尝试重命名一些方法,但到目前为止我没有任何运气。你介意在回购协议中做一个请求吗?当然,当你有时间的时候。。。我需要A和B的映射,所以我想重命名是唯一的选择,不是吗?嗨,迪普,做了一些实验。。。更改方法名称不会更改任何内容。最后还是同一个签名,所以还是模棱两可的。删除方法确实有效。它们都做完全相同的事情,所以删除哪一个并不重要。根据您的建议,我将进一步研究部分限定符。这听起来确实是一个更干净的解决方案。我希望它将使jHipster 2.21成为现实,因为我确信很多人都受到这个bug的影响。我想我们应该把错误报告放在一边,不是吗?谢谢你的帮助:)请让它保持openHi Deepu,因为它的价值:我删除了我现有映射程序中的所有userFromId方法。然后,我创建了自己的UserMapper,它具有userFromId方法,并通过每个映射器中的@Mapper注释引用它。虽然我不确定这是不是最好的方法,但这似乎有效。我知道在更复杂的情况下(例如我的例子中的A&B实体)删除该方法不再有效。
@Mapper(componentModel = "spring", uses = {BMapper.class, UserMapper.class})