【问题标题】:How to receive multiple RequestBody in a controller and save it according to its type in Spring Boot?如何在一个控制器中接收多个RequestBody并在Spring Boot中根据其类型保存?
【发布时间】:2021-11-16 12:29:11
【问题描述】:

我是spring boot的新手,提前谢谢你。我面临一个问题:我想在控制器中接收两种类型的对象,使用@ResponseBody,然后保存它们。

我有两个模型

public class Person {
    int a;
    int b;
    int c;
}

public class Human {
    int a;
    int b;
    int c
}

通过这样做:

@PostMapping(value="/save")
public void savePerson(@RequestBody Person person,  @RequestBody Human human) {
    personRepo.save(person);
    humanRepo.save(human);          
}

我想在同一个请求中保存人和人。如何做到这一点?

【问题讨论】:

  • 您的代码看起来不错。有什么问题?
  • 它只保存人员信息,但对人员显示为空,但我想在同一请求中同时保存人员和人员,因为两者具有相同的字段
  • 所以humannull?还是它与person 具有相同的值?请澄清。
  • 是的,两者的值相同

标签: spring spring-boot spring-mvc spring-data-jpa


【解决方案1】:

你可以做的是:创建一个包含这两个对象的对象:

public class PersonAndHuman {

    private Person person;
    private Human human;

    // getters and setters...
}

你的控制器应该收到这个对象:

@PostMapping(value="/save")
public void savePerson(@RequestBody PersonAndHuman personAndHuman) {
    personRepo.save(personAndHuman.getPerson());
    humanRepo.save(personAndHuman.getHuman());          
}

现在,如果您使用 JSON 来发布帖子,请执行以下操作:

{
   "human" : {
       //body here
   },
   "person": {
       //body here
   }
}

【讨论】:

  • 感谢您的回答,但我正在寻找的是我想在只有 { "human": {} } 的人和人中发布。我的意思是说它应该只用人工发布。
  • 你能用你可能的 json 正文更新问题吗?也许我也可以更新我的答案。
【解决方案2】:

Person 和 Human 是同一个“实体”吗?我的意思是 post 请求中的值是否相同?

如果是,我会从 Arguments 中删除 Human 并基于 Person 创建它

@PostMapping(value="/save")
public void savePerson(@RequestBody Person person) {
      
        Human human = mapPersonToHuman(); 
        personRepo.save(person);
        humanRepo.save(human);          
}

否则如果人和人是两个不同的东西, 我会创建一个新的 Wrapper 对象,这样您就可以使用这两个实体发送新消息。

public class PersonHumanWrapper{
    Person person;
    Human human;
}

【讨论】:

  • 感谢您的回答,但它只保存人员数据,而人类数据为空。我想用一个人的唯一帖子保存两个实体,因为它们都有相同的列标题和数据类型
猜你喜欢
  • 1970-01-01
  • 2017-03-22
  • 2022-01-17
  • 1970-01-01
  • 2020-03-25
  • 2021-12-21
  • 1970-01-01
  • 1970-01-01
  • 2018-02-11
相关资源
最近更新 更多