Найдены неоднозначные методы отображения для свойства отображения - PullRequest
0 голосов
/ 26 апреля 2018

У меня есть две доменные сущности:

class Identity {
   Long id;
   Set<Business> businesses;
}

class Business {
   Long id;
   String name;
}

У меня есть два DTO, которые расширяют базовый DTO:

class BaseDto {
   String id;
}

class IdentityDto extends BaseDto {
   Set<BaseDto> businesses;
}

class BusinessDto extends BaseDto {
   String name;
}

Затем я создал картограф, который отображает список моего доменаобъекты либо в набор конкретного dto, либо в набор более общего базового dto.Это потому, что когда я получаю список предприятий, мне нужен полный бизнес dto, но когда я получаю личность, я просто использую базовую информацию в своем списке предприятий.

Но когда я пытаюсь создатьПри отображении идентификатора я получаю следующую ошибку:

Ambiguous mapping methods found for mapping property
"Set<Business> businesses" to Set<BaseDto>:

Set<BusinessDto> BusinessMapper.toSet(Set<Business> businesses),
Set<BaseDto> BusinessMapper.toBaseSet(Set<Business> businesses).

Я думал, что mapstruct использует наиболее специфический метод, поэтому следует знать, что в этом случае следует использовать метод toIdentifierSet.

Как мне заставить mapstruct узнать, какой метод использовать?

1 Ответ

0 голосов
/ 28 апреля 2018

Здесь нет наиболее конкретного метода, так как вы пытаетесь отобразить на Set<BaseDto>.

Вы можете использовать Выбор метода отображения на основе квалификаторов .

Вы можете определить некоторые аннотации:

@Qualifier
@Target(ElementType.METHOD)
@Retention(RetentionPolicy.CLASS)
public @interface BaseInfo {
}

Затем в вашем BusinessMapper

@Mapper
public interface BusinessMapper {

    Set<BusinessDto> toSet(Set<Business> businesses);

    @BaseInfo
    Set<BaseDto> toBaseSet(Set<Business> businesses);
}

Затем в вашем идентификаторе

@Mapper
public interface IdentifierMapper {

    @Mapping(target = "businesses", qualifiedBy = BaseInfo.class)
    IdentityDto map(Identity source);
}

Если вы хотите явно выбрать всегда, вы можете добавить еще одну аннотацию BusinessInfo, а затем аннотировать другой метод.Тогда вам нужно будет каждый раз выбирать метод.

...