java - 如何通过 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 作为请求正文中的字段传递。我该如何处理?
解决方案
假设您使用的是 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,它将在 DB 中创建一个新行并自动分配 id
PS - 根据您拥有的数据库,您可以为该数据库选择最佳的 id 生成策略。例如,基于身份的生成适用于 MySQL,基于序列的生成适用于 Oracle db。
推荐阅读
- php - 为什么我无法使用 VichUploaderBundle 和 Symfony 5 在我的网页上显示图像?
- osgi - Karaf Bundle.getState() 与 bundle:list 中的 bundle 状态不完全匹配
- spring - Spring data jpa避免内存分页和n+1使用规范
- reactjs - 试图在特定页面上隐藏父组件
- sas - 打破 SAS 分类的联系
- python - 为什么我的第二个 Jinja for 循环没有运行?
- c++ - 如何防止我的函数的调用者在 C++ 中使用相同的按引用传递变量?
- css - 通过 uBlock Origin 中的 CSS 覆盖修复 div 的宽度
- java - 如何在 Spring-mvc 项目中配置静态文件(CSS/JS)?
- java - Android 电源菜单小部件快速访问钱包 PaymentCardManager