当前位置: 首页 > 知识库问答 >
问题:

从arrayList检索MapStruct

长孙谦
2023-03-14

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

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

源对象

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

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

可以通过

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

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

目标对象

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

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

细节主题

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中,这将正常工作,但是当我试图从列表中获取它时,这将成为一个问题。我得到的错误是:

[错误]无法执行目标组织。阿帕奇。专家插件:maven编译器插件:3.5.1:在项目模板上编译(默认编译):编译失败:编译失败:

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

[ERROR].../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);
}

共有1个答案

苍志文
2023-03-14

您试图进行的映射是不可能的,因为您混合了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);
}

然后,MapSTRt将生成正确的代码。

另一种选择是使用@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);
}

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

 类似资料:
  • 问题内容: 我正在学习Java,并且遇到了和的问题。 我有一个称为的对象,该对象具有从另一个名为的类创建的对象的数组列表。 我需要一种方法,其中返回item列表中一个对象的所有信息。 该随意选择的需求。 当我尝试编译时,出现错误,指出System.out.println行说.. 问题答案: 是一个方法,调用在你的return语句之后,因此由于无法访问而无法进行编译。 可能希望将其重写为:

  • 问题内容: Java中是否有一种方法,只需指定开始索引和结束索引,即可将对象列表从Arraylist获取到另一个ArrayList? 问题答案: 是的,您可以使用以下方法: 这将返回原始列表那部分的视图,它不会复制数据。 如果要复制:

  • 如何使用ArrayList检索Student类的单个属性,或者检查列表中是否存在“AAA ”?

  • 今天好,这有点让我迷惑(大脑冻结!)好像少了些什么。有一个我用HashMap填充的ArrayList。现在我放入了我的HashMap和ArrayList。 由于am解析JSON,arraylist的大小显著增加。现在我的问题是如何从ArrayList中的两个映射键中获得值?我试过这个 但我似乎不能得到所有的值。映射大小总是返回值2,这只是元素。如何从ArrayList中的映射键获取所有值?谢谢

  • 我正在编写一个程序来模拟咖啡馆中的一个系统,在这个系统中,接受顾客订单的人给顾客一个代币号码,并将顾客的代币号码以及他/她订购的物品输入到一个系统中。recordOrder功能执行此操作,允许输入订单详细信息。订单由令牌ID、tID和表示订单中项目的字符串数组列表表示。 以下是我到目前为止所做的: 问题是,只有我输入的最后一个项目被打印出来,也就是说,假设我输入的令牌编号为9,项目编号为3,项目名

  • 问题内容: 我的arraylist包含String数组对象。我如何获得所有价值?我的代码如下 如果我尝试像上面给出的那样进行检索, 怎么做? 问题答案: 您还必须遍历字符串数组。