【问题标题】:Map same object multiple times with different ignore fields使用不同的忽略字段多次映射同一个对象
【发布时间】:2017-06-15 14:09:27
【问题描述】:

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

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

【问题讨论】:

  • 错误发生在哪个方法上?您使用的是哪个版本的 MapStruct?

标签: java dto mapstruct


【解决方案1】:

错误有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 了解更多信息。

第二:您的User 中有Iterable / Map 的用户

这也可以用第一种方法解决。但是,在这里你有一个循环依赖,所以试试 1.2.0 中的新 @Context。看看mapstruct-mapping-with-cycles 的例子。

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

如果是这种情况,那么在生成的类中,MapStruct 将尝试在 bean 之间生成一个映射方法,并且 MapStruct 将寻找一个可用于映射 bean 中的 Users 的方法,并将导致 @ 987654343@。

这个的解决方法和第二个一样。

【讨论】:

  • 我有另一个方法List<User> userDTOsToUsers( List<UserDTO> userDTOs ); 应该使用方法UserDTO userToUserDTO( User user );。如果我添加UserDTO userToUserDTOWithoutRoles( User user );,我认为实现不知道它是否应该使用userToUserDTOuserToUserDTOWithoutRoles,也许添加限定符会有所帮助
  • 其他使用UserMapper 的映射器应该使用什么?是的,添加限定符是正确的方法。一旦你告诉我其他映射器应该使用什么,我会更新我的答案。您能否更新您的问题以包含List
猜你喜欢
  • 2015-04-15
  • 1970-01-01
  • 2012-04-23
  • 2012-08-18
  • 1970-01-01
  • 1970-01-01
  • 2022-12-14
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多