Java 从arrayList检索MapStruct

Java 从arrayList检索MapStruct,java,mapstruct,Java,Mapstruct,我正在尝试使用MapStruct映射两个对象。我已经搜索了一段时间,但没有找到任何东西,尽管我是编程新手,所以我相信这比我现在做的要容易 下面是一些精简的代码(请注意,实际代码更为复杂,arraylist中的子对象与目标对象子变量的类型与此处不同): 源对象 目标对象 细节主题 制图员 如果我将DetailsObject直接放在SourceObject中,这将很好,但当我尝试从列表中获取它时,这将成为一个问题。我得到的错误是: [错误]无法在项目模板上执行目标org.apache.maven.p

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

下面是一些精简的代码(请注意,实际代码更为复杂,arraylist中的子对象与目标对象子变量的类型与此处不同):

源对象

目标对象

细节主题

制图员

如果我将DetailsObject直接放在SourceObject中,这将很好,但当我尝试从列表中获取它时,这将成为一个问题。我得到的错误是:

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

[错误]…/src/main/java/Mapper/SourceToDestinationMap.java:[12,13]源参数中不存在名为“list.get(0).details.姓氏”的属性。你是说“名单,空的”吗

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

编辑:映射程序的当前状态:

@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);
}
@Mapper
公共接口SourceToDestinationMap{
@映射(target=“details”,source=“list”)
DestinationObject到Destination(源对象源);
默认DetailsObject映射(列表源){
返回映射(source.get(0));
}
DetailsObject映射(ListObject源);
}

您尝试进行的映射是不可能的,因为您混合了bean属性和bean函数

您不能使用
@映射(source=“list.get(0.XXX”)
。尚不支持使用索引访问列表元素,请参阅

解决问题的一种方法是使用与示例中相同的限定符

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

@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将按原样使用表达式中的文本,并且不会执行任何验证检查。因此,它可能有点脆弱,因为不会出现
null
和空检查。

您尝试进行的映射是不可能的,因为您混合了bean属性和bean函数

您不能使用
@映射(source=“list.get(0.XXX”)
。尚不支持使用索引访问列表元素,请参阅

解决问题的一种方法是使用与示例中相同的限定符

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

@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将按原样使用表达式中的文本,并且不会执行任何验证检查。因此它可能有点脆弱,因为不会出现
null
和空检查。

请提供完整的映射程序代码和您收到的编译错误您的映射代码是错误的,或者更具体地说,您的类的代码与您试图映射的不一致。抱歉,我希望我能找到一个能告诉我如何轻松从arraylist中获取信息的人,希望这是一项普通的任务。我没有试图从我的项目中提取所有细节,而是创建了一个简单的项目,展示了我正在尝试做的事情,我更新了我的第一篇文章以反映这一点。希望这能有所帮助:)好吧,当我们不知道实际问题是什么的时候,我们不能为你指明方向。如果您的示例甚至没有生成有效的MapStruct代码,这就特别困难。查找解决方案的好地方始终是和库请提供完整的映射程序代码和您收到的编译错误您的映射代码错误,或者更具体地说,您的类的代码与您尝试映射的代码不一致。抱歉,我希望我能找到一个能告诉我如何轻松从arraylist中获取信息的人,希望这是一项普通的任务。我没有试图从我的项目中提取所有细节,而是创建了一个简单的项目,展示了我正在尝试做的事情,我更新了我的第一篇文章以反映这一点。希望这能有所帮助:)好吧,当我们不知道实际问题是什么的时候,我们不能为你指明方向。如果您的示例甚至没有生成有效的MapStruct代码,这就特别困难。一个寻找解决方案的好地方永远是商店和仓库。感谢您迄今为止的帮助!提供我自己的方法似乎是最好的方法。线路返回源有问题!=空&!source.isEmpty():映射(source.get(0)):null;如:抛出语法错误。你知道为什么吗?有语法错误。
应该是
。您还可以根据需要实现该方法。这只是一个示例谢谢,我以前在Java中没有遇到过三元表达式。为了使我的代码保持简单,我将使用returnmap(source.get(0));现在,我可以稍后添加验证。我现在编译了它,但测试失败了,因为它们在映射后存储在dest.details.forename变量中,而不是预期的tmpForename,对于姓氏变量也是如此。如果我在映射器中将“object”更改为“objectClass”,则表达式方式会起作用,但如果可以的话,我宁愿做验证。我不明白你的问题。你可以用我的第一个选择。此外,如果这满足了您的问题,您应该接受答案感谢您迄今为止的帮助!提供我自己的方法似乎是最好的方法。线路返回源有问题!=空&!source.isEmpty():映射(source.get(0)):null;如:抛出语法错误。你知道为什么吗?有语法错误。
应该是
。您还可以根据需要实现该方法。这只是个例子谢谢你,我没来
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);
@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);
}
@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);
}
@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);
}