有3種可能性的錯誤:
首先:您還有其他映射器取決於您的UserMapper
或者您有更多方法未顯示。當您遇到像這樣的情況時,MapStruct將嘗試使用其中一種定義的方法來映射其他方法。
我想你想有一個方法作爲默認值,其他的應該手動或顯式使用。爲此,您需要使用MapStruct @Named
/@Qualifier
和Mapping#qualifiedByName
/Mapping#qualifiedBy
。
你的映射器將需要看起來像:
@Mapper
public interface UserMapper {
@Named("detailedUser")
UserDTO userToUserDTO(User user);
@Mapping(target = "roles", ignore = true)
UserDTO userToUserDTOWithoutRoles(User user);
}
如果你有這樣的則是使用UserMapper
將使用userToUserDTOWithoutRoles
每默認情況下所有其他地圖。爲了使用另一種方法,你需要做這樣的事情:
@Mapper(uses = { UserMapper.class})
public interface OtherMapper {
@Mapping(source = "user", target = "user", qualifiedByName = "detailedUser")
OtherDTO map(Other other);
}
看一看Mapping methods based on qualifiers有關它的更多信息。
二:你有用戶的Iterable
/Map
在User
這也可以與第一種方法解決。然而,在這裏你有一個循環依賴,所以你可以從1.2.0中嘗試新的@Context
。看看mapstruct-mapping-with-cycles的例子。
如果您使用第三種方法1.2.0,並且User
中的某個bean引用了User
。
如果是這種情況,那麼在生成的類MapStruct將嘗試生成豆類和MapStruct之間的映射方法將尋找它可以使用到User
S IN的Bean映射,並會導致Ambiguous mapping methods...
的方法。
解決方法與第二個相同。
錯誤發生在哪種方法上?你正在使用哪個版本的MapStruct? – Filip