【问题标题】:Array of Objects in Spring Boot REST APISpring Boot REST API 中的对象数组
【发布时间】:2021-02-07 16:26:34
【问题描述】:

[解决了! 代码中体现的解决方案]

我正在使用 Spring Boot 开发一个项目,我需要 在 JSON 中包含对象组的数组。它应该看起来像这个例子:

{  
  "Spring20": [
    {
      "CSCXXX": "Machine Learning",
       . . . 
    },
    {
      "CSCXXX": "Computer Vision",
       . . . 
    }
  ],  

  "Fall20": [
    {
      "EEXXX": "Electronics",
       . . . 
    }
  ]
}

我尝试使用一个 Map 来存储 Array 主题名称的 String 和一个 List 来保存所有类对象。它位于服务类中。

 HashMap<String, List<Courses>> courseList = new HashMap<String, List<Courses>>();

[修改为适合解决方案]

服务

  public void add( Map<String, List<Courses>> course) {
        course.forEach((string, list) -> {
             if(course_list.containsKey(semester)) {
                course_list.get(semester).addAll(course);
            } else {
                course_list.put(semester, course);
            }
        });  
    }
    public void edit(String semester, String id, Courses courses) {
          // Get the Course list from the Map
          List<Courses> updatedCourse = course_list.get(semester);
          // Loop and find the matching object within the list
          for(int i=0; i<updatedCourse.size(); i++){
            if (updatedCourse.get(i).getID().equals(id)){
                // Once object found, update its values in the list 
                updatedCourse.get(i).set(course.getSubject())
                . . .
                // Finally, replace the list within the map
                course_list.replace(semester,  updatedCourse);
            }
        }
    }

控制器

    @RequestMapping(method=RequestMethod.POST, value="/add")
    public void addCourse(@RequestBody Map<String, List<Courses>> course) {
        service.addTest(course);
    }

    @RequestMapping(method=RequestMethod.PUT, value="/edit/{semster}/{id}")
    public void addCourse(@PathVariable("semester") String semester, @PathVariable("id") String id, @RequestBody Courses course) {
        service.editTest(semester, id, course);
    }

当我第一次添加 JSON 并获得正确的 JSON 结构时,一切都按预期工作。但是,添加和编辑值时会变得复杂。

  1. [SOLVED] 每当我将单个对象添加到数组中时,它都会替换之前在数组中的所有对象。 例如,我在“2020 年春季”数组中有两个对象。如果我使用 addCourse() 发出另一个 POST 请求,两个对象都会被替换
  2. [已解决] 如果我尝试使用邮递员进行编辑,我会遇到一些异常 罢工>
PUT: localhost:8080/edit/Spring20/
 >> "message": "Missing URI template variable 'semester' for method parameter of type String",

我尝试对此进行调查,但没有找到任何有用的链接或示例,其中人们使用 Spring Boot 对 JSON 进行分类和组织。如果有什么可以帮助的,请在下面评论。

编辑 以下解决方案有助于修复这些错误。我希望这篇文章可以帮助任何可能遇到相同问题的人!

这是我在 MongoDB 中使用 Map 的另一篇文章。 CRUD operations on Array objects nested within an Object in MongoDB Spring Boot

【问题讨论】:

  • /edit/{semster}/{id} 期望类似于edit/spring20/1 这里spring20 是学期1 是id。而且您没有将 PathVariable 用于semster
  • 不幸的是,这是 REST API 最常见的困难之一。 JSON Patch 之类的想法试图解决它,但这只是偶尔使用(而且 Spring 没有内置支持)。
  • 是的,我没有找到任何处理这个问题的在线资源。我很高兴能够获得帮助并找到解决方案!

标签: java spring-boot rest


【解决方案1】:

看看以下内容:

每当我将单个对象添加到数组时,它都会替换以前在数组中的所有对象。例如,我在“Spring 2020”数组中有两个对象。如果我使用 addCourse() 发出另一个 POST 请求,两个对象都会被替换。

问题是您使用的是map.put()。使用此方法时,如果映射先前包含键的映射,则旧值将替换为指定值。因此,您的旧值将被删除。

解决方案是获取并更新现有条目。

public void add( Map<String, List<Courses>> course) {
    course.forEach((semester, list) -> {
        if(courseList.contains(semester)) {
            courseList.get(semester).addAll(list); // Note, list accepts duplicates
        } else {
            courseList.put(semester, list);
        }
    });
}

如果我尝试使用邮递员进行编辑,我会遇到一些异常。 PUT:本地主机:8080/编辑/Spring20/ "message": "String 类型的方法参数缺少 URI 模板变量 'semester'",

问题是您的路径变量名称semester 与url semster 中的名称不匹配。因此,Missing URI template variable 'semester'

@RequestMapping(method=RequestMethod.PUT, value="/edit/{semester}/{id}")
public void addCourse(@PathVariable("semester") String semester, @PathVariable("id") String id, @RequestBody Courses course) {
    service.editTest(semester, course);
}

【讨论】:

    猜你喜欢
    • 2020-10-11
    • 2015-05-31
    • 2021-04-13
    • 2021-08-28
    • 2019-03-11
    • 2021-05-19
    • 2021-02-10
    • 2020-11-13
    • 1970-01-01
    相关资源
    最近更新 更多