使用不同的忽略字段多次映射同一对象

时间:2017-06-15 14:09:28

标签: java dto mapstruct

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

@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,我可以添加默认方法,也许有更好的解决方案...

1 个答案:

答案 0 :(得分:0)

错误有三种可能性:

首先:您有其他依赖于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的所有其他Mapper默认情况下都会使用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中将尝试生成bean之间的映射方法,MapStruct将寻找一个方法,它可以用来映射bean中的User并将导致在Ambiguous mapping methods...

这个解决方案与第二个解决方案相同。

相关问题