如何使用MapStruct将树结构转换为列表(以简单的方式)



如何使用MapStruct将树结构转换为列表(以简单的方式(?

给定类别Foo

import lombok.Getter;
import lombok.Setter;
@Getter
@Setter
public class Foo {
String a;
Bar[] bar;
@Getter
@Setter
public static class Bar {
String b;
}
}

和类别Foobar

@Getter
@Setter
public class Foobar {
String a;
String b;
}

让我们定义转换:

@Mapping(target = "a", source = "foo.a")
@Mapping(target = "b", source = "bar.b")
Foobar convert(Foo foo, Foo.Bar bar);

问题:

如何定义从Foo[]到List<Foobar>

List<Foobar> convert(Foo[] foos); // <-- this is not working

我得到了:

java:未映射的目标属性:"b";。从Collection元素映射"Foo Foo"至";Foobar Foobar";。

//编辑的

事实上,我的情况更复杂,有点像:

class A {
long id;
B[] b;
class B {
LocalDate d;
C[] c;
}
class C {
int i;
D[] d;
}
class D {
String s;
}
}

原因

MapStruct不知道是要将所有Foo.bar对象转换为单独的对象,还是只映射一个显式对象。

例如:

List<Foobar> convert(Foo[] foos);

将尝试使用映射方法Foobar convert(Foo foo)而不是Foobar convert(Foo foo, Foo.Bar bar)

对于集合,您可以期望输入大小等于mapstruct的输出大小。因此,5个Foo对象应该会变成5个FooBar对象,如果你想增加它,你必须为此编写一些手动代码,请参阅下文。

解决方案

mapstruct所支持的是在详细级别设置映射,然后您需要手动调用它

例如:

@Mapping(target = "a", source = "foo.a")
@Mapping(target = "b", source = "bar.b")
Foobar convert( Foo foo, Foo.Bar bar );
default List<Foobar> convert( Foo[] foos ) {
List<Foobar> result = new ArrayList<>();
for ( Foo foo : foos ) {
for ( Foo.Bar bar : foo.bar ) {
result.add( convert( foo, bar ) );
}
}
return result;
}

使用更复杂的例子:

@Mapping(target = "id", source = "a.id")
@Mapping(target = "date", source = "b.d")
@Mapping(target = "number", source = "c.i")
@Mapping(target = "text", source = "d.s")
Result convert( A a, B b, C c, D d );
default List<Result> convert( A[] as ) {
List<Result> result = new ArrayList<>();
for ( A a : as ) {
for ( A.B b : a.b ) {
for ( A.C c : b.c ) {
for ( A.D d : c.d ) {
result.add( convert( a, b, c, d ) );
}
}
}
}
return result;
}

相关内容

  • 没有找到相关文章

最新更新