2015-09-09 102 views
2

我正在做一個jHipster的實驗。如何解決模糊映射方法

我創建了兩個由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 

的定義很簡單: 爲:

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

}

對於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" 

}

我真的被困在這。 任何幫助非常感謝!

編輯:演示該問題https://github.com/andyverbunt/jhipster-m2m.git

+0

爲什麼你有映射兩種方法從ID用戶?他們有什麼不同? – Gunnar

+0

嗨Gunnar,感謝您的反饋。 AFAIK,沒有兩種方法將id映射到用戶,至少不在同一個對象中。實體A需要知道它的所有者,B也是一樣,但它們是不同的對象。 我會在github上發佈示例並編輯帖子,以便友好的助手可以看看它。 –

+0

您是否手動更改了任何內容?如果看起來不像我們使用mapstruct生成的bug。當mapstruct試圖將userID從DTO映射到User中的id時,它看到兩個方法'userFromId'正在執行該功能,一個在AMapper中,另一個在BMapper中 – Deepu

回答

3

提供了GitHub庫這似乎是在評論上述的錯誤。暫時你可以從一個mapper中移除該方法或者在任何一個mapper中重命名該方法,我們需要研究如何在Jhipster中生成這個方法

這也可以通過使用MapStruct限定符(參見參考文檔中的Selection based on Qualifiers)。

+0

嗨Deepu,希望我更好地瞭解maptruct的工作原理。我嘗試重命名一些方法,但到目前爲止我沒有任何運氣。你會介意在回購中做出這樣的拉動請求 - 當然你有時間... https://github.com/andyverbunt/jhipster-m2m 我需要在A和B,所以我想重命名是唯一的選擇,不是嗎? –

+0

嗨Deepu, 做了一些實驗... 更改方法名稱不會改變任何東西。最後它仍然是相同的簽名,所以它仍然不明確。 刪除方法確實有效。他們都做同樣的事情,所以你刪除哪一個並不重要。 根據你的建議,我會進一步研究部分限定詞。它絕對聽起來像一個更乾淨的解決方案。我希望這會讓jHipster 2.21變得更好,因爲我相信很多人都受到這個bug的影響。 我想我們應該把bugreport打開,不是嗎? 感謝您的幫助:) –

+0

雅請將它打開 – Deepu

0

這似乎是一個錯誤,但不是像上面提到的那樣。 JHipster映射器生成器無法將@Mapper(...,users = {UserMapper.class})正確添加到Mapper類。我在一年後回答這個問題,因爲JHipster 3.12.2的情況仍然如此。

在您共享替換以下行的源代碼:

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

有了這個:

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