【问题标题】:Spring: Type definition error when posting a new object using a REST serviceSpring:使用 REST 服务发布新对象时出现类型定义错误
【发布时间】:2018-06-24 21:59:25
【问题描述】:

我有一个对象,它通过 json POST 请求获取两个参数以在数据库中创建一个新条目,我收到此错误:

"类型定义错误:[简单类型,类 ffuentese.rest_example.Persona];嵌套异常是 com.fasterxml.jackson.databind.exc.InvalidDefinitionException:不能 构造ffuentese.rest_example.Persona 的实例(无创作者, 像默认构造,存在):不能从对象值反序列化 (没有基于委托或基于属性的创建者)在 [来源: (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";

}

【问题讨论】:

    标签: java spring rest


    【解决方案1】:

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

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

    这样您将更加灵活,并且您不会将对象绑定到实际的实体模型。

    【讨论】:

      【解决方案2】:

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

      【讨论】:

        【解决方案3】:

        当我遇到类似的异常时,我向实体添加了默认构造函数,异常不再存在。

        【讨论】:

        • 最佳答案涵盖了空构造函数的使用。
        猜你喜欢
        • 2021-04-14
        • 2023-03-09
        • 1970-01-01
        • 2012-07-04
        • 1970-01-01
        • 1970-01-01
        • 2011-06-05
        • 2018-08-06
        • 1970-01-01
        相关资源
        最近更新 更多