错误有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 了解更多信息。
第二:您的User 中有Iterable / Map 的用户
这也可以用第一种方法解决。但是,在这里你有一个循环依赖,所以试试 1.2.0 中的新 @Context。看看mapstruct-mapping-with-cycles 的例子。
第三,您使用的是 1.2.0,并且您的 User 中的某些 bean 引用了 User。
如果是这种情况,那么在生成的类中,MapStruct 将尝试在 bean 之间生成一个映射方法,并且 MapStruct 将寻找一个可用于映射 bean 中的 Users 的方法,并将导致 @ 987654343@。
这个的解决方法和第二个一样。