1
Eai guys, all right? I started studying Spring recently on my own and am trying to create a Rest API for enrolling students and exams at a school.
I have the following problem:
When I make a GET request to list all students enrolled in the bank, returns a giant json like this:
localhost:8080/api/students
[{
    "id" : 1,
    "nome" : "Carlos Eduardo Ribeiro",
    "media" : 0.0,
    "provas" : [{
        "id" : 1,
        "nota" : 0.0,
        "aluno" : {
            "id" : 1,
            "nome": "Carlos Eduardo Ribeiro",
            "media" : 0.0,
            "provas" : [{
                "id" : 1,
                "nota" : 0.0,
                "aluno" : {
                    "id" : 1,
                    "nome" : "Carlos Eduardo Ribeiro",
                    "media": 0.0,
                    "provas": [{
                        "id" : 1,
                        "nota" : 0.0,
                        "aluno" : {
                            "id" : 1,
                            "nome":"Carlos Eduardo Ribeiro",
                            "media":0.0,
                            "provas": [{
                                ......
                                    ......
                                        ......
Here are the models: 
Java student.
@Entity(name = "aluno")
public class Aluno {
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false, length = 50)
    private String nome;
    @Column(nullable = false)
    private Float media;
    // Um aluno contem uma lista de Provas:
    @OneToMany(mappedBy = "aluno")
    private List<Prova> provas;
    // Construtor
    public Aluno() {
        this.setMedia(0.0f);
    }
    // Getters | Setters
    
}
Java tasting.
@Entity
public class Prova {
    @Id
    @GeneratedValue
    private Long id;
    @Column(nullable = false)
    private Float nota;
    @ManyToOne
    @JoinColumn(name = "id_aluno")
    private Aluno aluno;
    @OneToMany(mappedBy = "prova")
    private List<Questao> questoes;
    // Contrutor:
    public Prova() {
        this.setNota(0.0f); // define a nota padrão
    }
    // Getters | Setters
    
}
Here is the Controller: Alunocontroller.java
@RestController
public class AlunoController {
    @Autowired
    private AlunosRepository repository;
    // Faz uma consulta pelo id do aluno:
    @GetMapping(path = "/api/aluno/{id}")
    public ResponseEntity consultar(@PathVariable(name = "id") Integer id) {
        // Faz e retorna a consulta:
        return this.repository.findById(id)
                .map(record -> ResponseEntity.ok().body(record))    // Monta e retorna o ResponseBody com o registro
                .orElse(ResponseEntity.notFound().build());         // Caso contrário retorna um notFound
    }
    // Cadastra um novo aluno:
    @PostMapping(path = "/api/aluno/cadastrar")
    public Aluno cadastrar(@RequestBody Aluno aluno) {
        return this.repository.save(aluno); // Cadastra o aluno recebido no RequestBody e retorna
    }
    // Retorna todos os alunos cadastrados:
    @GetMapping(path = "/api/alunos")
    public List<Aluno> consultarAlunos() {
        return this.repository.findAll();
    }
}
I tried to make:
I tried to change the query method Students() to go through the records with a foreach and go assigning null to the student object of the Test entity and it worked, however, I do not want the result return the "student" within each test in the list.
The method was like this:
@GetMapping(path = "/api/alunos")
public @ResponseBody ResponseEntity<Aluno> consultarAlunos() {
    List<Aluno> alunos = new ArrayList<>(); // Cria uma lista para receber o resultado da request
    List<Prova> provas = new ArrayList<>(); // Array list para armazenas as provas sem o objeto aluno.
    // Percorre a lista de alunos:
    for ( Aluno aluno : this.repository.findAll() ) {
        // percorre a lista de provas do aluno:
        for( Prova prova : aluno.getProvas() ) {
            prova.setAluno(null);   // O objeto aluno não precisa ser especificado mais de uma vez.
            provas.add(prova);
        }
        aluno.setProvas(provas);
        alunos.add(aluno);
    }
    return new ResponseEntity(alunos, HttpStatus.OK);   // Cria e retorna os resultados.
}
localhost:8080/api/students
[{
    "id" : 1,
"nome" : "Carlos Eduardo Ribeiro",
        "media" : 0.0,
    "provas" : [
        {
            "id" : 1,
            "nota" : 0.0,
            "aluno" : null,
            "questoes" : []
        }
    ]
}]
How do I get a result similar to the above, however in place of the "student" : null I get the id related to proof? Thank you.
A suggestion would be in the method query Lunos use as return a DTO and customize the return information as needed and in the future until adding a pagination in this method as well. Here is a legal explanation of DTO: https://medium.com/@msealvial/shielding-its-api-spring-boot-with-the-standard%C3%A3o-dto-44f97020d1a0
– adrianosymphony
Thanks for the tip, I’m already in the DTO classes. Regarding the above problem, I solved it by adding a @Jsonignore in the student property of the Proof entity.
– Carlera