【问题标题】:How to populate an object with embedded collection from a Map?如何使用地图中的嵌入式集合填充对象?
【发布时间】:2017-09-19 08:06:38
【问题描述】:

我正在尝试使用 Dozer 解决此问题,但尚未找到相关信息:

我想使用 Dozer 从 http 请求参数填充嵌入式集合。

请求参数可作为 java.util.Map(如下面的“requestMap”)供我使用,条目如下所示:

Map<String, String> requestMap (key -> value) =
- "id" -> "15"
- "title" -> "Nice article about electric cars"
- "comments[0].text" -> "comment 1"
- "comments[1].text" -> "comment 2"

我想要填充的 bean:

public class Article {
  int id;
  String title;
  List<Comment> comments;
}

public class Comment {
  String text;
}

当我使用“mapper.map(requestMap, article)”时,文章“title”和“id”属性会很好地从地图中填充。但是,“cmets”集合不会被填充。

Dozer 也应该能够填充集合吗?我该怎么做才能填充它?

【问题讨论】:

    标签: java collections pojo dozer


    【解决方案1】:

    我认为Dozer 不够聪明,无法将comments[0].text 映射为ListComment

    您可以手动从 yourrequestMap 中提取您的值并从中列出。

    List<Comment> comments = map.entrySet().stream()
                .filter(entry -> entry.getKey().startsWith("comments"))
                .map(entryTwo -> new Comment(entryTwo.getValue()))
                .collect(Collectors.toList());
    

    然后将其包含在您的文章中:

    article.setComments(comments);
    

    【讨论】:

      【解决方案2】:

      地图当然可以有收藏。
      当您使用地图时,您只能有两个参数 --> Map&lt;Integer, String&gt; 例如。
      这就是为什么您需要有一个键/ID 和一个对象。在这种情况下,您可以映射文章及其 ID。

      public class Article {
        int id;
        String title;
        List<String> comments; //IMO you don't need class for comments(comment = string)
      }
      

      Map&lt;Integer, Article&gt;key == id 在您的文章中。

      查看 this 链接了解如何从 Dozer 映射集合

      【讨论】:

      • 感谢您的回答。 Comments 实体在现实生活中更复杂,我只是为了一个易于理解的问题而尝试精简类。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 2014-10-31
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2017-10-03
      • 2017-05-04
      • 2021-07-18
      相关资源
      最近更新 更多