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.