春季:使用REST服务发布新对象时发生类型定义错误

时间:2018-06-24 21:59:25

标签: java spring rest

我有一个对象,该对象通过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";

}

2 个答案:

答案 0 :(得分:9)

您需要一个空的构造函数,以允许Jackson正确执行其反序列化操作。

此外,使用实体模型作为数据传输对象不是一个好主意。我建议创建一个PersonaDto,其中将包含为对象构造所需的所有字段,并使用Spring converter将其转换为Persona对象。

通过这种方式,您将更加灵活,而且不必将对象绑定到实际的实体模型。

答案 1 :(得分:0)

如果您使用来自 lombok@Builder,但没有明确定义 getter/setter,也没有像我的情况那样通过 @Data 定义 getter/setter,这也可能发生,原因是builder 使用空构造函数先创建一个空对象,然后使用 setter 设置属性。