Solucionado (ver solução)
Solucionado
(ver solução)
9
respostas

Não consigo adicionar nenhum valor utilizando chave estrangeira.

Boa tarde, estou tentando aplicar um projeto para por em pratica o que aprendi no curso. É como se fosse um cadastro de alunos e agendamento de aulas. Possuo duas Entidades, uma Aluno e uma Agendamento. No AlunoController faço o cadastro de alunos no banco de dados(estou utilizando o mySQL), e com o AgendamentoController eu gostaria de realizar o Agendamento de um dia e hora e gostaria que aparecesse o nome do aluno que foi agendado. Só que sempre que coloco o nome do aluno, da erro 400 "Bad Request".

ALUNO

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.validation.constraints.NotBlank;



@Entity
public class Aluno {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int matricula;

    @NotBlank
    private String nome;
    @NotBlank
    private String cpf;
    @NotBlank
    private String email;


    public Aluno() {

    }

    public Aluno(@NotBlank String nome, String cpf, String email) {
        super();
        this.nome = nome;
        this.cpf = cpf;
        this.email = email;
    }

    public int getMatricula() {
        return matricula;
    }

    public void setMatricula(int matricula) {
        this.matricula = matricula;
    }

    public String getNome() {
        return nome;
    }

    public void setNome(String nome) {
        this.nome = nome;
    }

    public String getCpf() {
        return cpf;
    }

    public void setCpf(String cpf) {
        this.cpf = cpf;
    }

    public String getEmail() {
        return email;
    }

    public void setEmail(String email) {
        this.email = email;
    }

}

AGENDAMENTO

package br.com.vitu.teste.model.entities;

import javax.persistence.Entity;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.JoinColumn;
import javax.persistence.ManyToOne;
import javax.validation.constraints.NotBlank;

@Entity
public class Agendamento {

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private int matricula;

    @ManyToOne
    @JoinColumn(name = "nome_matricula")
    private Aluno nome;

    @NotBlank
    private String diasemana;

    @NotBlank
    private String hora;

     public Agendamento() {

    }

    public Agendamento( Aluno nome, @NotBlank String diasemana, @NotBlank String hora) {
        super();
        this.nome = nome;
        this.diasemana = diasemana;
        this.hora = hora;
    }


    public int getMatricula() {
        return matricula;
    }

    public void setMatricula(int matricula) {
        this.matricula = matricula;
    }

    public Aluno getNome() {
        return nome;
    }

    public void setNome(Aluno nome) {
        this.nome = nome;
    }

    public String getDiasemana() {
        return diasemana;
    }

    public void setDiasemana(String diasemana) {
        this.diasemana = diasemana;
    }

    public String getHora() {
        return hora;
    }

    public void setHora(String hora) {
        this.hora = hora;
    }

ALUNO CONTROLLER

package br.com.vitu.teste.controller;

import java.util.List;
import java.util.Optional;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import br.com.vitu.teste.model.entities.Aluno;
import br.com.vitu.teste.model.repository.AlunoRepository;

@RestController
@RequestMapping("/teste/aluno")
public class AlunoController {


    @Autowired
    private AlunoRepository alunoRepository;

    @PostMapping
    public @ResponseBody Aluno novoAluno(@Valid Aluno aluno) {
        alunoRepository.save(aluno);
        return aluno;

    }

    @GetMapping
    public List<Aluno> consultarAluno(){
        return alunoRepository.findAll();
    }

    @GetMapping(path = "/matricula/{matricula}")
    public Optional<Aluno> consultarAlunoId(@PathVariable int matricula){
        return alunoRepository.findById(matricula);
    }

    @GetMapping(path = "/nome/{nome}")
    public List<Aluno> consultarAlunoNome(@PathVariable String nome){
        return alunoRepository.findByNomeContainingIgnoreCase(nome);
    }


    @PutMapping
    public Aluno alterarAluno(@Valid Aluno aluno) {
        alunoRepository.save(aluno);
        return aluno;
    }

    @DeleteMapping(path = "/matricula/{matricula}")
    public void deletarAluno(@PathVariable int matricula) {
        alunoRepository.deleteById(matricula);
    }


}
9 respostas

AGENDAMENTO CONTROLLER

package br.com.vitu.teste.controller;

import java.util.List;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.DeleteMapping;
import org.springframework.web.bind.annotation.GetMapping;
import org.springframework.web.bind.annotation.PathVariable;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.PutMapping;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.ResponseBody;
import org.springframework.web.bind.annotation.RestController;

import br.com.vitu.teste.model.entities.Agendamento;
import br.com.vitu.teste.model.repository.AgendamentoRepository;

@RestController
@RequestMapping(path = "/teste/agendamento")
public class AgendamentoController {

    @Autowired
    private AgendamentoRepository agendamentoRepository;

    @PostMapping
    public @ResponseBody Agendamento novoAgendamento(@Valid Agendamento agendamento) {

        List<Agendamento> verificardia = consultarAgendamentoDiasemana(agendamento.getDiasemana());
        List<Agendamento> verificarhora = consultarAgendamentoHora(agendamento.getHora());

        if(verificardia.isEmpty()) {
            return agendamentoRepository.save(agendamento);
        } else if (verificarhora.isEmpty()) {
            return agendamentoRepository.save(agendamento);
        } return null;

    }

    @GetMapping
    public List<Agendamento> consultarAgendamento(){
        return agendamentoRepository.findAll();
    }

    @GetMapping(path = "/dia/{diasemana}")
    public List<Agendamento> consultarAgendamentoDiasemana(@PathVariable String diasemana) {
        return agendamentoRepository.findByDiasemana(diasemana);
    }

    @GetMapping(path = "/hora/{hora}")
    public List<Agendamento> consultarAgendamentoHora(@PathVariable String hora) {
        return agendamentoRepository.findByHora(hora);
    }

    @PutMapping
    public Agendamento alterarAgendamento(@Valid Agendamento agendamento) {
        agendamentoRepository.save(agendamento);
        return agendamento;
    }

    @DeleteMapping(path = "/{matricula}")
    public void deletarAgendamento(@PathVariable int matricula) {
        agendamentoRepository.deleteById(matricula);
    }


}

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

Oi Vitor,

O problema é que no postman você está enviando os parâmetros na opção x-www-form-urlencode, mas na verdade deve marcar a opção raw e passar os dados no formato JSON, conforme demonstrado no curso de Spring Boot.

Eu pensei que poderia ser isso e fiz utilizando o raw, mas acontece a mesma coisa. Mesmo erro 400 - bad request

Insira aqui a descrição dessa imagem para ajudar na acessibilidade

solução!

Agora acho que o problema é porque na sua classe Agendamento o atributo nome não é uma String e sim um objeto do tipo Aluno:

private Aluno nome;

Então você não pode enviar o json assim: "nome": "Vitor Lima", pois vai dar erro 400. Você deve passar um objeto json com os campos do Aluno:

{
    "nome": {
        "nome" : "Vitor Lima",
        "matricula": 123
    },
    "diasemana": "domingo",
    "hora": "15:00"
}

Não funcionou mesmo assim :/. Deu a mesma mensagem novamente

Faltou adicionar também a anotação @RequestBody no parâmetro agendamento do seu método novoAgendamento no controller:

novoAgendamento(@Valid @RequestBody Agendamento agendamento)

Consegui realizar o cadastro! Muito obrigado!

Só mais uma duvida, no banco de dados fica com a matricula na tabela Agendamento. Para que fiquei o nome da pessoa, a anotação @Id teria que ser no parametro nome ?

Oi Vitor,

No banco de dados deve ficar o ID mesmo, que é a chave estrangeira que se relaciona com a outra tabela e lá é que tem o restante dos dados. No seu caso você não declarou um atributo ID na entidade, mas utilizou o próprio atributo matricula. Não tem problema, mas no caso será a matricula do aluno que vai ficar salva na tabela de agendamento e não o nome dele.