2017-06-15 143 views
0

我想有一個這樣的映射器,映射器的一種方法應該忽略角色字段。用不同的忽略字段多次映射相同的對象

@Mapper 
public interface UserMapper 
{ 
     UserDTO userToUserDTO(User user); 

     @Mapping(target = "roles", ignore = true) 
     UserDTO userToUserDTOWithoutRoles(User user); 

} 

在編譯期間我有這個錯誤Ambiguous mapping methods found for mapping collection element to UserDTO。 我不想再創建一個DTO只是刪除角色領域,我可以添加一個默認的方法,也許有更好的解決辦法...

+0

錯誤發生在哪種方法上?你正在使用哪個版本的MapStruct? – Filip

回答

0

有3種可能性的錯誤:

首先:您還有其他映射器取決於您的UserMapper

或者您有更多方法未顯示。當您遇到像這樣的情況時,MapStruct將嘗試使用其中一種定義的方法來映射其他方法。

我想你想有一個方法作爲默認值,其他的應該手動或顯式使用。爲此,您需要使用MapStruct @Named/@QualifierMapping#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/MapUser

這也可以與第一種方法解決。然而,在這裏你有一個循環依賴,所以你可以從1.2.0中嘗試新的@Context。看看mapstruct-mapping-with-cycles的例子。

如果您使用第三種方法1.2.0,並且User中的某個bean引用了User

如果是這種情況,那麼在生成的類MapStruct將嘗試生成豆類和MapStruct之間的映射方法將尋找它可以使用到User S IN的Bean映射,並會導致Ambiguous mapping methods...的方法。

解決方法與第二個相同。

+0

我有另一種方法'列表 userDTOsToUsers(列表 userDTOs);'應該使用'UserDTO userToUserDTO(用戶用戶)'''方法。如果我添加'UserDTO userToUserDTOWithoutRoles(用戶用戶);'我認爲實現不知道它應該使用'userToUserDTO'還是'userToUserDTOWithoutRoles',可能添加限定符將有所幫助 –

+0

使用UserMapper的其他映射器應該使用什麼?是的,添加限定符是正確的方法。一旦你告訴我其他mapper應該使用什麼,我會更新我的答案。你還可以更新你的問題,包括'List'? – Filip

相關問題