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

标签 java dto mapstruct

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

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

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

 }

我在编译期间遇到此错误发现将集合元素映射到 UserDTO 的模糊映射方法。 我不想创建另一个 DTO 只是为了删除角色字段,我可以添加一个默认方法,也许有更好的解决方案...

最佳答案

错误有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 中的User的方法并将导致不明确的映射方法...

该问题的解决方法与第二个相同。

关于java - 使用不同的忽略字段多次映射同一对象,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/44569731/

相关文章:

c# - NHibernate 和 DTO

java - 有没有一种方法可以使用 MapStruct 运行程序,而无需每次都进行 Maven 全新安装?

java - 配置 mockito 以在验证错误消息中打印实际参数值

java - 使用剩余端点扩展或缩小 PCF 应用程序

java - 验证 c3p0 使用 JPA 运行

java - 用 Kotlin 数据类替换 Java DTO 类的问题

.net - 将 DTO 映射到域对象的最佳实践?

java - Jersey Web 服务不处理 XML,而是处理 JSON

java - MapStruct:如何从 "java.lang.Object to "java.lang.String 映射属性”

mapstruct - mapstruct 是否可以与 JPA 元模型类一起使用?