我有一个对象定义为:
@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":"买果汁" 作为请求体,RestController 可以创建一个任务实例。但是我不想将 id 作为请求正文中的字段传递。我该如何处理?
最佳答案
假设您使用的是 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 的保存现在将按如下方式工作
- 如果请求中存在 id,它将假定实体存在并更新它
- 如果请求中不存在 id,它将在数据库中创建一个新行并自动分配 id
P.S. - 根据您拥有的数据库,您可以为该数据库选择最佳的 ID 生成策略。例如,基于身份的生成适用于 MySQL,基于序列的生成适用于 Oracle db。
关于java - 如何通过 RestController 创建对象的实例,而不通过 RequestBody 传递构造函数的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925548/