首页 > 解决方案 > 如何通过 RestController 创建对象的实例,而不通过 RequestBody 传递构造函数的所有字段?

问题描述

我有一个对象定义为:

@Entity
@NoArgsConstructor
public class Task {
    @Id
    @Getter @Setter private Integer id;
    @Getter @Setter private String text;
    @Getter @Setter private Boolean isDone = Boolean.FALSE;

    public Task(int id, String text){
        this.id = id;
        this.text = text;
        this.isDone = Boolean.FALSE;
    }
}

如果我传入 { "id:":1, "text":"buy juice" } 作为请求正文,RestController 可以创建一个任务实例。但是,我不想将 id 作为请求正文中的字段传递。我该如何处理?

标签: javaspringspring-bootjackson

解决方案


假设您使用的是 MySQL,请按如下方式更改您的实体

@Entity
@NoArgsConstructor
@Getter 
@Setter 
public class Task {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    private String text;
    private Boolean isDone = Boolean.FALSE;

    public Task(int id, String text){
        this.id = id;
        this.text = text;
        this.isDone = Boolean.FALSE;
    }
}

然后您的请求将更改为简单地传递文本:{"text":"buy juice" }

JPA 的保存现在将按以下方式工作

  1. 如果请求中存在 id,它将假定实体存在并更新它
  2. 如果请求中不存在 id,它将在 DB 中创建一个新行并自动分配 id

PS - 根据您拥有的数据库,您可以为该数据库选择最佳的 id 生成策略。例如,基于身份的生成适用于 MySQL,基于序列的生成适用于 Oracle db。


推荐阅读