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现在可以如下工作
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代码>