我有一个对象,该对象通过json POST请求获取两个参数以在数据库中创建一个新条目,并且出现此错误:
“类型定义错误:[简单类型,类 ffuentese.rest_example.Persona];嵌套异常为 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:无法 构造
ffuentese.rest_example.Persona
的实例(没有创建者, 像默认构造一样,存在):无法从Object值反序列化 (没有基于委托人或基于财产的创建者),请访问[资料来源: (PushbackInputStream);行:2,列:3]“,
这是对象:
@Entity
public class Persona {
@Id
@GeneratedValue(strategy=GenerationType.AUTO)
private Integer id;
private String nombre;
private String apellido;
public Persona(String nombre, String apellido) {
this.nombre = nombre;
this.apellido = apellido;
}
public Integer getId() {
return id;
}
public String getNombre() {
return nombre;
}
public void setNombre(String nombre) {
this.nombre = nombre;
}
public String getApellido() {
return apellido;
}
public void setApellido(String apellido) {
this.apellido = apellido;
}
}
这是控制器方法:
@PostMapping(path="/persona")
public @ResponseBody String addPersona(@RequestBody Persona p) {
personaRepository.save(p);
return "success";
}
答案 0 :(得分:9)
您需要一个空的构造函数,以允许Jackson正确执行其反序列化操作。
此外,使用实体模型作为数据传输对象不是一个好主意。我建议创建一个PersonaDto
,其中将包含为对象构造所需的所有字段,并使用Spring converter
将其转换为Persona
对象。>
通过这种方式,您将更加灵活,而且不必将对象绑定到实际的实体模型。
答案 1 :(得分:0)
如果您使用来自 lombok 的 @Builder
,但没有明确定义 getter/setter,也没有像我的情况那样通过 @Data
定义 getter/setter,这也可能发生,原因是builder 使用空构造函数先创建一个空对象,然后使用 setter 设置属性。