gpt4 book ai didi

java - MapStruct 从 arrayList 中检索

转载 作者:行者123 更新时间:2023-12-01 20:05:02 24 4
gpt4 key购买 nike

我正在尝试使用 MapStruct 来映射两个对象。我已经搜索了一段时间,但没有找到任何东西,尽管我是编程新手,所以我确信它比我做的要容易。

这里是一些剥离的代码(请注意,真正的代码更复杂,数组列表中的子对象与此处的目标对象子变量的类型不同):

SourceObject

public class SourceObject {
public ArrayList<ListObject> list = new ArrayList<ListObject>();

public SourceObject() {
list.add(new ListObject());
}
}

ListObject

public class ListObject {
public DetailsObject details = new DetailsObject();

public ListObject() {
details.forename="SourceForename";
details.surname="SourceSurname";
}
}

DestinationObject

public class DestinationObject {
public DetailsObject details = new DetailsObject();

public DestinationObject() {
details.forename="DestinationForename";
details.surname="DestinationSurname";
}
}

DetailsObject

public class DetailsObject {
public String forename;
public String surname;
}

映射器

@Mappings({
@Mapping(target="details.forename", source="list.get(0).details.forename"),
@Mapping(target="details.surname", source="list.get(0).details.surname"),
})
DestinationObject toDestination(SourceObject source);

如果我将DetailsObject 直接放入SourceObject 中,这会工作得很好,但当我尝试从列表中取出它时,就会出现问题。我得到的错误是:

[错误]无法在项目模板上执行目标 org.apache.maven.plugins:maven-compiler-plugin:3.5.1:compile (default-compile): 编译失败: 编译失败:

[错误] .../src/main/java/Mapper/SourceToDestinationMap.java:[12,13] 源参数中不存在名为“list.get(0).details.surname”的属性。您指的是“list.empty”吗?

[错误] .../src/main/java/Mapper/SourceToDestinationMap.java:[11,9] 源参数中不存在名为“list.get(0).details.forename”的属性。您指的是“list.empty”吗?

编辑:映射器的当前状态:

@Mapper
public interface SourceToDestinationMap {

@Mapping(target = "details", source = "list")
DestinationObject toDestination(SourceObject source);

default DetailsObject map(List<ListObject> source) {
return map(source.get(0));
}

DetailsObject map(ListObject source);
}

最佳答案

您尝试执行的映射是不可能的,因为您正在混合 bean 属性和 bean 函数。

您不能使用@Mapping(source = "list.get(0).XXX")。尚不支持使用索引访问列表元素,请参阅 #1321 .

解决您的问题的一种方法是以与 mapstruct-iterable-to-non-iterable 中使用限定符相同的方式使用限定符。示例。

或者您可以提供自己的方法来执行映射。

@Mapper
public interface MyMapper {

@Mapping(target = "details", source = "list")
DestinationObject toDestination(SourceObject source);

default DetailsObject map(List<ListObject> source) {
return source != null && !source.isEmpty() ? map(source.get(0)) : null;
}

DetailsObject map(ListObject source);
}

MapStruct 随后将生成正确的代码。

另一种选择是使用@Mapping(expression="java()"

您的映射器将如下所示:

@Mapper
public interface MyMapper {

@Mapping(target = "details.forename", expression = "java(source.list.get(0).details.forename)")
@Mapping(target = "details.surname", expression = "java(source.list.get(0).details.surname)")
DestinationObject toDestination(SourceObject source);
}

表达式的注释。 MapStruct 将按原样使用表达式中的文本,并且不会执行任何验证检查。因此它可能有点脆弱,因为不会有 null 和空检查。

关于java - MapStruct 从 arrayList 中检索,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/47577111/

24 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com