java - Mapstruct映射嵌套类问题
问题描述
我的映射定义有问题。我希望你能给我一个提示如何解决它。我最初的情况是,我有嵌套类的类。输入嵌套类的大部分属性可以直接映射到目标嵌套类。但是输入嵌套类的一个属性必须直接映射到目标类。
这是我的代码:
public class Input {
public String aa;
public NestedClass nestedMember;
public static class NestedClass {
public String ab;
public String ac;
public String ad;
public String ae;
}
}
public class Target {
public NestedClass nestedMember;
public static class NestedClass {
public String ba;
public String bb;
public String bc;
public String bd;
}
}
@Mapping(target = "nestedMember.ba", source = "aa")
@Mapping(target = "nestedMember", source = "nestedMember")
Target map(Input input);
@Mapping(target = "bb", source = "ab")
@Mapping(target = "bc", source = "ac")
@Mapping(target = "bd", source = "ad")
@Mapping(target = "ba", ignore = true)
NestedClass mappingNested(test.Input.NestedClass nestedClass);
我的假设是,mapstruct 将使用 mappingNested 方法映射嵌套类,然后将 aa 的直接属性映射到 nestedMember.ba。
但是生成的类看起来像这样:
public class MyMapperImpl implements MyMapper {
@Override
public Target map(Input input) {
if ( input == null ) {
return null;
}
Target target = new Target();
if ( input.nestedMember != null ) {
if ( target.nestedMember == null ) {
target.nestedMember = new NestedClass();
}
nestedClassToNestedClass( input.nestedMember, target.nestedMember );
}
if ( target.nestedMember == null ) {
target.nestedMember = new NestedClass();
}
inputToNestedClass( input, target.nestedMember );
return target;
}
@Override
public NestedClass mappingNested(test.Input.NestedClass nestedClass) {
if ( nestedClass == null ) {
return null;
}
NestedClass nestedClass1 = new NestedClass();
nestedClass1.bb = nestedClass.ab;
nestedClass1.bc = nestedClass.ac;
nestedClass1.bd = nestedClass.ad;
return nestedClass1;
}
protected void nestedClassToNestedClass(test.Input.NestedClass nestedClass, NestedClass mappingTarget) {
if ( nestedClass == null ) {
return;
}
}
protected void inputToNestedClass(Input input, NestedClass mappingTarget) {
if ( input == null ) {
return;
}
mappingTarget.ba = input.aa;
}
}
所以 mapstruct 正确地生成了 mappingNested 方法,但不使用它来映射nestedClasses。Mapstuct 生成一个没有任何映射的方法(nestedClassToNestedClass)。如果我删除显式 aa 映射,一切正常。但是我有一个问题,我应该如何映射 aa 映射?我不打算在 map 方法中映射 nestedClass 的每个属性。有人有想法吗?此致。
解决方案
我找到了一个解决方案:
@Mapping(target = "nestedMember", source = ".")
Target map(Input input);
@Mapping(target = "bb", source = "nestedClass.ab")
@Mapping(target = "bc", source = "nestedClass.ac")
@Mapping(target = "bd", source = "nestedClass.ad")
@Mapping(target = "ba", ignore = true)
NestedClass mappingNested(test.Input.NestedClass nestedClass);
default NestedClass mappingNested(Input input) {
NestedClass nestedClass = mappingNested(input.nestedMember);
nestedClass.ba = input.aa;
return nestedClass;
}
推荐阅读
- python - import pyzbar.pyzbar - 找不到 zbar 共享库
- node.js - 如何在 node express 中同时使变量在路由和模板中可用?
- sql - 分配上的 SQL 连接问题
- python - 如何从python中列表的特定索引开始循环?
- javascript - 有没有办法为制表器中的列标题获取鼠标悬停事件?
- javascript - Discord.js 为什么我的帮助命令不起作用?
- python - 如何将python文本字符串转换为List?
- go - 什么是正确的 ZMQ 模式?
- html - 对齐 div 中的内容:绝对到底部和相对于中心
- javascript - 按钮的输入值可以是切换时发生变化的图像吗?