2015-09-09 2 views
2

Я делаю эксперимент с jHipster.Как исправить двусмысленные методы сопоставления

Я создал два объекта A и B, поддерживаемые DTO (mapstruct). Между ними существует взаимосвязь «многие-ко-многим». У них обоих есть отношения «много-к-одному» с пользователем.

До создания последних отношений все работает нормально. После создания последних многих к одному отношений, я получаю следующее сообщение об ошибке:

[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 

Определение очень просто: For A:

{ 
    "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" 

Я действительно застрял на этом. Любая помощь очень ценится !!

EDIT: Обеспечение GitHub репо, что демонстрирует проблему https://github.com/andyverbunt/jhipster-m2m.git

+0

Почему у вас есть два способа отображения из идентификатора пользователя? В чем их отличие? – Gunnar

+0

Привет, Gunnar, спасибо за отзыв. AFAIK, нет двух способов сопоставления идентификатора пользователю, по крайней мере, на том же объекте. Сущность A должна знать своего владельца, и то же самое касается B, но они разные объекты. Я отправлю пример на github и отредактировал сообщение, так что дружеская рука может взглянуть на него. –

+0

Вы что-то изменили вручную? если не похоже на ошибку в том, что мы создаем с помощью mapstruct. когда mapstruct пытается сопоставить идентификатор пользователя с DTO с идентификатором в User, он видит два метода 'userFromId', выполняющий эту функцию, один в AMapper и другой в BMapper – Deepu

ответ

3

Это похоже на ошибку, как указано в комментарии выше. На данный момент вы можете либо удалить метод из одного из картографов, либо переименовать метод в каком-либо одном картографе, нам нужно будет выяснить, как этого избежать во время генерации в Jhipster

Это также можно исправить с помощью квалификаторов MapStruct (см. Selection based on Qualifiers в справочной документации).

+0

Привет, Дипу, желаю, чтобы я лучше знал, как работает Mapstruct.Я попытался переименовать некоторые из методов, но до сих пор мне не повезло. Не могли бы вы сделать запрос на растяжение в репо, который я сделал для этого, - когда у вас есть время, конечно ... https://github.com/andyverbunt/jhipster-m2m Мне нужно отображение как в A, так и в B, поэтому я предполагаю, что переименование - единственная альтернатива, нет? –

+0

Hi Deepu, Проведено несколько экспериментов ... Изменение имени метода ничего не меняет. В конце концов, это все та же самая подпись, поэтому она все еще неоднозначна. Удаление метода действительно работает. Они оба делают то же самое, поэтому не имеет значения, какой из них вы удаляете. Согласно вашему предложению, я дополнительно рассмотрю квалификаторы раздела. Это определенно звучит как более чистое решение. Я надеюсь, что это сделает jHipster 2.21, поскольку я убежден, что многие люди пострадали от этой ошибки. Я думаю, мы должны оставить сообщение об ошибке открытым, нет? Спасибо за помощь :) –

+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}) 

 Смежные вопросы

  • Нет связанных вопросов^_^