开发者社区 问答 正文

使用self关键字的推土机内部类映射

我想映射一个类A,它是类B中的一个属性,如下所示:

class A {
    private String f1;
    private String f2;
    private String f3;
    private B f4;
}

class B {
    private String f1; // redunandance here
    private String f5;
}

我检查了文档,发现可以使用self关键字来引用当前的源对象。我对使用自我有误解吗?

基于此,我进行了此映射配置:

<mapping wildcard="false"  map-id="BToA">
    <class-a>com.mupackage.model.B</class-a>
    <class-b>com.mupackage.model.A</class-b>
    <!-- Defines the only different attribute name between class-a and class-b -->
    <field>
        <a>f1</a>
        <b>f1</b>
    </field>
    <field>
        <a>this</a>
        <b>f4</b>
    </field>
</mapping>

将类型B的属性f4映射到目标类A。映射后,A中的字段f4仍然为NULL,为什么?

展开
收起
垚tutu 2019-11-28 19:13:06 890 分享 版权
阿里云 AI 助理回答

从你的描述来看,你可能是在尝试使用对象映射技术来转换两个类实例之间的数据。虽然你没有明确指出使用的是哪个具体的映射库(如ModelMapper, MapStruct, 或者是Jackson等),但基于你的配置风格,我将假设这是一个通用的映射场景,并提供一个概念性的解答。

首先,根据你的配置意图,看起来你是想把class B的一个实例作为class A中的一个属性f4进行映射。但是,直接用"this"关键字在映射配置中通常不是用来引用当前源对象整体的,而是用来指代源对象中的相同名称的属性。因此,如果你的意图是将整个B实例赋值给A的f4字段,这样的配置方式可能不会按预期工作。

正确的做法取决于你使用的具体映射库,但一般来说,你需要显式地告诉映射器如何处理这种嵌套对象的关系。以下是一个简化的、假设性的示例,说明了如何可能正确地配置这种关系:

假设使用MapStruct

如果你使用的是MapStruct,你可能需要创建一个映射接口,并在其中定义如何处理这种嵌套结构。MapStruct会自动生成实现该接口的映射代码。

@Mapper
public interface MyMapper {
    A toA(B b);
    
    // 如果B到A的映射较为复杂或需要特殊处理,可以单独定义
    default A toAWithB(B b) {
        A a = new A();
        // 手动设置基本属性
        a.setF1(b.getF1());
        a.setF2(...); // 设置其他属性
        a.setF3(...);
        // 直接设置B实例到f4
        a.setF4(b);
        return a;
    }
}

假设使用ModelMapper

对于ModelMapper,你可以通过类型映射和表达式来处理这种情况:

ModelMapper modelMapper = new ModelMapper();
modelMapper.createTypeMap(B.class, A.class)
    .addMappings(mapper -> {
        mapper.map(src -> src, A::setF4); // 显式映射B实例到A.f4
        mapper.map(src -> src.getF1(), A::setF1); // 其他属性映射
        // ...其他映射逻辑
    });

问题分析

  • 为什么A中的字段f4仍然为NULL? 主要是因为映射配置没有正确指示如何将整个B实例赋值给A的f4字段。直接使用"this"或其他类似尝试可能未被映射库正确解析为“将当前源对象作为目标对象的属性”。

总之,解决这个问题的关键在于理解并正确应用所选映射库的特定语法和功能,以确保嵌套对象的正确映射。希望上述示例能为你提供一些指导。如果使用的是其他映射库,请参考相应文档以获取准确的配置方法。

有帮助
无帮助
AI 助理回答生成答案可能存在不准确,仅供参考
0 条回答
写回答
取消 提交回答
问答地址: