Найдены неоднозначные методы отображения для свойства отображения
У меня есть две доменные сущности:
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 ответ
Здесь нет наиболее конкретного метода, так как вы пытаетесь отобразить в 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
а затем аннотировать другой метод. Тогда вам нужно будет выбрать метод каждый раз.