繁体   English   中英

带有 Spring Boot 的 API Rest

[英]API Rest with Spring Boot

我正在看一些关于 API Rest with Spring Boot 的视频,到目前为止我已经完成了一些基础知识,当我试图增加复杂性时,我被抓住了。

我的想法是在 Post / class 中,创建一个新类,让学生获得以下 json:

{
  "nome": "Primeira Serie - A".
  "alunos": [
    "João",
    "José",
    "Maria"
  ]
}

并返回:

{
  "id_classe": 101
}

碰巧它保存了班级,但它没有保存学生,我不知道如何只显示班级的 id。

我在 Java 中创建了以下类:

模型

类.java

package com.example.classe.model;

//Import's suppressed

@Entity
@Table(name = "classe")
public class Classe {

    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;

    private String nome;

    @OneToMany(mappedBy = "classe")
    private Set<Aluno> alunos = new HashSet<Aluno>();   

    //Get's e Set's suppressed
}

阿鲁诺.java

package com.example.classe.model;

//Import's suppressed

@Entity
@Table(name = "aluno")
public class Aluno {

    private static int tempID = 0;
    @Id
    @GeneratedValue(strategy = GenerationType.AUTO)
    private Integer id;
    private String nome;

    @ManyToOne
    @JoinColumn(name = "id_classe")
    @JsonBackReference
    private Classe classe;

    public Aluno(String nome) {
        tempID++;
        this.id = tempID;
        this.nome = nome;
    }

    public Aluno() {
    }

    //Get's e Set's suppressed  

}

存储库

类Repository.java

package com.example.classe.repository;

//Import's suppressed

@Repository
public interface ClasseRepository extends JpaRepository<Classe, Integer> {

    public List<Classe> findAll();

}

控制器

类控制器.java

package com.example.classe.controller;

//Import's suppressed

@RestController
@RequestMapping("/classe")
public class ClasseController {

    @Autowired
    private ClasseRepository classeRepo;

    @RequestMapping(method = RequestMethod.GET, produces = MediaType.APPLICATION_JSON_UTF8_VALUE)
    public ResponseEntity<Collection<Classe>> getClasse() {
        return new ResponseEntity<>(classeRepo.findAll(), HttpStatus.OK);
    }

    @RequestMapping(method = RequestMethod.POST)
    public ResponseEntity<?> salvarClasse(@RequestBody Classe classe) {
        return new ResponseEntity<>(classeRepo.saveAndFlush(classe), HttpStatus.CREATED);
    }

}

我做错了一切还是我不理解这个概念? 但我想了解如何做到这一点。

提前致谢。

塞萨尔·斯图里昂

您想要实现的目标是完全可行的,但需要进行一些更改。 我把我的答案分成两部分:


救救学生

保存有几个问题:

  1. 在 POST 时,传入的 json 反序列化为Classe引用Anuli ,但Anuli没有引用Classe 要检查它,您可以在该行添加一个断点: return new ResponseEntity<>(... ,在调试模式下运行并检查ClasseAnuli字段。要修复它,您可以在Classe aluni 字段上添加@JsonManagedReference相关题

  2. 默认情况下,Hibernate 无法保存引用的对象。 您必须在保存 Classe 对象后一一保存它们,或者只需打开 Cascade 持久化。 相关问题

因此,要修复 1 和 2 Classe应该具有:

  @OneToMany(mappedBy = "classe", cascade = CascadeType.PERSIST)
  @JsonManagedReference
  private Set<Aluno> alunos = new HashSet<Aluno>();
  1. 您必须删除 Alumi 中的自定义 id 生成(我说的是static int tempID )。 只要你持久化一个对象,注释@GeneratedValue就会完美地为你生成 id。 此自定义生成破坏了 Hibernate 支持。 我什至没有谈论它在重启后也会破坏应用程序,而不是线程安全等。

仅返回 ID

在 POST 返回的 json 表示在classeRepo.saveAndFlush(classe)返回的内容,因此它是Classe的对象。

如果你想完全返回这个:

{
    "id_classe": 101
}

然后像这样创建新类:

 public class ClasseIdVO {
    @JsonProperty("id_casse")
    private Integer id;
 // Constructors, getter, setter

VO - 表示视图对象,所以这个对象只用于表示,不用于持久化等。

您可以使用字段名称id_casse ,但它违反 Java 代码约定,因此最好添加@JsonProperty

new ClasseIdVO(classeRepo.saveAndFlush(classe).getId())您的保存代码更改为new ClasseIdVO(classeRepo.saveAndFlush(classe).getId())

或者您可以将 id 作为数字返回: classeRepo.saveAndFlush(classe).getId()

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM