当前位置: 首页 > 知识库问答 >
问题:

Mapstruct-忽略嵌套类中的特定字段

松和安
2023-03-14

我需要一些使用MapStruct映射嵌套POJO的帮助。我需要跳过/删除目标类中所有子类的特定字段。

例如,以下是我的目标POJO

class FullCustomerInfo {

    UnitIdInfo unitIdInfo;
    CustomerIdInfo customerIdInfo;
    NameInfo nameInfo;
    CustomerTypeInfo customerTypeInfo;
    AddressInfo addressInfo;

}

所有这些子类——UnitIdInfoCustomerIdInfoNameInfo。。。包含一个字段“fieldToIgnore”,我想在映射时忽略它。这种结构使得这些类不共享包含此字段的公共基类——“fieldToIgnore”。

我创建的映射器如下所示:

@Mapper
public interface MapFullCustomer {

    @Mappings({
            @Mapping(target = "unitIdInfo.fieldToIgnore", ignore = true),
            @Mapping(target = "customerIdInfo.fieldToIgnore", ignore = true),
            @Mapping(target = "nameInfo.fieldToIgnore", ignore = true),
            @Mapping(target = "customerTypeInfo.fieldToIgnore", ignore = true),
            @Mapping(target = "addressInfo.fieldToIgnore", ignore = true)
    })
    public FullCustomerInfo map(SourceCustomerInfo sourceCustomerInfo);

}

这工作。

然而,当FullCustomerInfo中的子类数量很大时,它会变得很乏味。我需要明确指定每个类。

有没有人能告诉我,这是否可以用一种更通用的方式来实现?

谢啦!

共有1个答案

景岳
2023-03-14

简单的方法是让所有类扩展包含fieldToIgnore公共字段的基类。

如果这不合适,您可以尝试在java反射api的帮助下实现一个customr,将所有字段设置为null:https://mapstruct.org/documentation/stable/reference/html/#adding-自定义方法

我认为这不值得努力。

 类似资料:
  • 我有以下DTO和域对象。我正在使用Mapstruct将域对象复制到DTO对象。 使用下面的映射器将域映射到DTO。我不想将电话属性从域映射到DTO。怎么做?我尝试在mapping ignore中提供嵌套目标属性,但它给出了错误:

  • 我使用以下映射器映射实体: 对于映射为集合的实体,我只需要忽略“数据”字段。但看起来仅适用于单个实体。我还注意到生成的方法只是在for循环中使用。对此有什么解决方案吗?

  • 我有以下实体类和类似的DTO类: 我使用MapSTRt进行以下映射: 复制到无ID的CarDto 问题是: carToCarDto()的生成映射器正在调用MapownerToWithoutId(),但copyCar方法没有调用mapOwnerWithoutId()。以下是生成的方法片段: 我有以下项目来复制这个。知道如何修复测试CarMapperTest吗? https://github.com/

  • 假设我有这些实体: null

  • 有几种方法可以忽略mapstruct中未映射的目标属性。 对于特定方法,我们可以列出要忽略的所有属性: 是否有一种方法可以混合这些方法并忽略方法级别的所有属性,而无需明确列出所有属性?

  • 如何告诉 Jackson ObjectMapper 从序列化中忽略特定类型(类)的字段的情况下)? 约束条件: 不控制源类-它是第三方类。 被序列化的类类型是未知的-我猜它取消了MixIn的资格。 此类字段的名称预先未知 为了提供帮助,下面是一个单元测试,期望从序列化中忽略字段和,但它的方法是不正确的,它是按名称而不是按类型过滤它们。