1

我想要一个这样的映射器,映射器的一种方法应该忽略角色字段。

@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 只是为了删除角色字段,我可以添加一个默认方法,也许有更好的解决方案......

4

1 回答 1

1

错误有3种可能:

第一:你有其他依赖于你的映射器UserMapper

或者您有更多未显示的方法。当您遇到这样的情况时,MapStruct 将尝试使用定义的方法之一来映射您的其他方法。

我想您希望将一种方法作为默认方法,而其他方法应手动或显式使用。为此,您将需要使用 MapStruct @Named/ @Qualifierwith Mapping#qualifiedByName/ Mapping#qualifiedBy

您的映射器需要如下所示:

@Mapper
public interface UserMapper {

    @Named("detailedUser")
    UserDTO userToUserDTO( User user );

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

如果你有这个,那么使用你的所有其他映射器UserMapperuserToUserDTOWithoutRoles默认使用。为了使用其他方法,您需要执行以下操作:

@Mapper(uses = { UserMapper.class})
public interface OtherMapper {

    @Mapping( source = "user", target = "user", qualifiedByName = "detailedUser")
    OtherDTO map( Other other );
}

查看基于限定符的映射方法以获取更多信息。

第二:您的用户中有Iterable/MapUser

这也可以用第一种方法解决。但是,在这里你有一个循环依赖,所以试试@Context1.2.0 的新版本。查看mapstruct-mapping-with-cycles示例。

第三,您使用的是 1.2.0,并且您的某些 beanUser引用了User.

如果是这种情况,那么在生成的类中,MapStruct 将尝试在 bean 之间生成一个映射方法,并且 MapStruct 将寻找一个可用于映射Userbean 中的 s 的方法,并将导致Ambiguous mapping methods....

解决方法与第二种相同。

于 2017-06-15T17:08:06.137 回答