我想映射一个类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,为什么?
版权声明:本文内容由阿里云实名注册用户自发贡献,版权归原作者所有,阿里云开发者社区不拥有其著作权,亦不承担相应法律责任。具体规则请查看《阿里云开发者社区用户服务协议》和《阿里云开发者社区知识产权保护指引》。如果您发现本社区中有涉嫌抄袭的内容,填写侵权投诉表单进行举报,一经查实,本社区将立刻删除涉嫌侵权内容。
从你的描述来看,你可能是在尝试使用对象映射技术来转换两个类实例之间的数据。虽然你没有明确指出使用的是哪个具体的映射库(如ModelMapper, MapStruct, 或者是Jackson等),但基于你的配置风格,我将假设这是一个通用的映射场景,并提供一个概念性的解答。
首先,根据你的配置意图,看起来你是想把class B
的一个实例作为class A
中的一个属性f4
进行映射。但是,直接用"this"关键字在映射配置中通常不是用来引用当前源对象整体的,而是用来指代源对象中的相同名称的属性。因此,如果你的意图是将整个B实例赋值给A的f4字段,这样的配置方式可能不会按预期工作。
正确的做法取决于你使用的具体映射库,但一般来说,你需要显式地告诉映射器如何处理这种嵌套对象的关系。以下是一个简化的、假设性的示例,说明了如何可能正确地配置这种关系:
如果你使用的是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 = 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); // 其他属性映射
// ...其他映射逻辑
});
总之,解决这个问题的关键在于理解并正确应用所选映射库的特定语法和功能,以确保嵌套对象的正确映射。希望上述示例能为你提供一些指导。如果使用的是其他映射库,请参考相应文档以获取准确的配置方法。