Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/spring/13.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 如何通过RestController创建对象的实例,而不通过RequestBody传递构造函数的所有字段?_Java_Spring_Spring Boot_Jackson - Fatal编程技术网

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

Java 如何通过RestController创建对象的实例,而不通过RequestBody传递构造函数的所有字段?,java,spring,spring-boot,jackson,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){

我有一个对象定义为:

@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, “文本”:“购买果汁”
}作为请求主体,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的save现在可以如下工作

  • 若请求中存在id,它将假定实体存在并更新它
  • 如果请求中没有id,它将在DB中创建新行并自动分配id

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

    您不必传递
    id
    的值,因为您已经将id的策略定义为
    strategy=GenerationType.sequence
    ,它将在保存到数据库时自动创建。您不应设置
    id
    ,因为它被标记为
    @GeneratedValue
    。只需调用no-args构造函数,设置
    text
    和(如果需要)
    isDone
    并持久化实体。事务结束后,将设置
    id
    GenerationType.SEQUENCE
    取决于您使用的数据库类型。例如,MySQL没有序列,Oracle DB有序列。对于MySql,
    @GeneratedValue(strategy=GenerationType.IDENTITY)
    工作得很好。编辑代码。我还没有
    GenerationType.SEQUENCE
    。因此,在请求体中传递id,它工作正常。但是,我现在想实现自动生成id,但无法弄清楚如何生成。如上文所述,用
    @GeneratedValue
    注释
    id
    ,让数据库生成
    id
    。请记住,只有在事务关闭或刷新后,才能保证更改可见。Works。谢谢对代码段的一个更改:
    id
    的类型为Long。您需要执行
    this.id=(long)id