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

qjp7pelc  于 2024-01-05  发布在  Spring
关注(0)|答案(4)|浏览(155)

我有一个对象,它通过一个json POST请求获取两个参数,在数据库中创建一个新条目,我得到这个错误:
“类型定义错误:[简单类型,类ffuentese.rest_example.Persona]; InvalidException:无法构造ffuentese.rest_example.Persona的示例(不存在创建者,如默认构造):无法从[源:(PushbackInputStream);行:2,列:3]处的Object值(不存在基于委托或基于属性的创建者)进行数据化",
这就是目标:

  1. @Entity
  2. public class Persona {
  3. @Id
  4. @GeneratedValue(strategy=GenerationType.AUTO)
  5. private Integer id;
  6. private String nombre;
  7. private String apellido;
  8. public Persona(String nombre, String apellido) {
  9. this.nombre = nombre;
  10. this.apellido = apellido;
  11. }
  12. public Integer getId() {
  13. return id;
  14. }
  15. public String getNombre() {
  16. return nombre;
  17. }
  18. public void setNombre(String nombre) {
  19. this.nombre = nombre;
  20. }
  21. public String getApellido() {
  22. return apellido;
  23. }
  24. public void setApellido(String apellido) {
  25. this.apellido = apellido;
  26. }
  27. }

字符串
这是控制器方法:

  1. @PostMapping(path="/persona")
  2. public @ResponseBody String addPersona(@RequestBody Persona p) {
  3. personaRepository.save(p);
  4. return "success";
  5. }

rfbsl7qr

rfbsl7qr1#

您需要一个空的构造函数来允许Jackson正确执行它的解析操作。
此外,使用实体模型作为数据传输对象并不是一个好主意。我建议创建一个PersonaDto,它将包含您需要为对象构造的所有字段,并使用Spring converter将其转换为Persona对象。
这样你会更灵活,你不会绑定你传输对象到实际的实体模型。

pdtvr36n

pdtvr36n2#

这也可能发生,如果你使用@Builderlombok,但没有明确定义getter/setter,也没有像我的例子中发生的那样通过@Data,因为builder使用空构造函数首先创建一个空对象,然后使用setter设置属性。

atmip9wb

atmip9wb3#

当我遇到类似的异常时,我将默认构造函数添加到不再有异常的实体中。

bqucvtff

bqucvtff4#

如果您使用Lombok岛。只需添加:

  1. @Builder
  2. @Data
  3. @NoArgsConstructor
  4. @AllArgsConstructor

字符串
声明了所有这些,Jackson就可以自动构建所有类型的构造函数。

相关问题