java - 如何通过 RestController 创建对象的实例,而不通过 RequestBody 传递构造函数的所有字段?

标签 java spring spring-boot jackson

我有一个对象定义为:

@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 的保存现在将按如下方式工作

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

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

关于java - 如何通过 RestController 创建对象的实例,而不通过 RequestBody 传递构造函数的所有字段?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/59925548/

相关文章:

java - 如何使用 jenkins 将 spring boot jar 文件部署到 EC2?

java - 如何在 Eclipse 中运行程序参数包含空格的应用程序?

java - 从 Firestore 获取 ArrayList 和文档名称

java - 搜索没有主键的记录

java - NoSuchBeanDefinitionException : No qualifying bean of type "XInterceptor"

tomcat - Spring 启动 war log4j2

java - 如何解析从周/年到dd/mm/yyyy

java - 使用@DirtiesContext BEFORE_CLASS 进行 Spring 启动测试

spring - 根本无法理解 Spring 社交,尤其是 ProviderSignInController

mysql - JPA 映射因奇怪消息而失败