Como alterar o resultado da requisição de uma API Rest com Spring?

Eai guys, tudo bem? Comecei estudar Spring recentemente por conta própria e estou tentando criar uma API Rest para cadastro de alunos e provas em uma escola.

Estou com o seguinte problema:

Quando eu faço uma requisição GET para listar todos os alunos cadastrados no banco, retorna um json gigante como esse:

localhost:8080/api/alunos

[{
	"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": [{
								......
									......
										......

Aqui está os models:

Aluno.java

@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
	
}

Prova.java

@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
	
}

Aqui está o 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();
    }

}

Tentei fazer:

Tentei alterar o método consultarAlunos() para percorrer os registros com um foreach e ir atribuindo null ao objeto aluno da entidade Prova e funcionou, porém, eu não quero que o resultado retorne o “aluno” dentro de cada prova na lista.

O método ficou assim:

@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.
}

resultado:

localhost:8080/api/alunos

[{
	"id" : 1,
"nome" : "Carlos Eduardo Ribeiro",
		"media" : 0.0,
	"provas" : [
		{
			"id" : 1,
			"nota" : 0.0,
			"aluno" : null,
			"questoes" : []
		}
	]
}]

Como eu faço para obter um resultado parecido com o acima, porém no lugar do “aluno” : null eu obter o id relacionado a prova?
Obrigado.

Não sei se funciona porque não tenho como testar agora, mas acredito que vc precise adicionar a anotação @JsonIgnore na propriedade aluno da entidade Prova, assim:

@ManyToOne
@JsonIgnore
@JoinColumn(name = "id_aluno")
private Aluno aluno;
1 curtida