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

Problema ao inserir valor no campo de chave estrangeira (recebo null no postman)

Estou a mais de 1 dia tentando cadastrar uma venda. Consigo inserir os dados de data, quantidade e valor total. Porém tenho mais dois campos chamados funcionario_id e produto_id, isso significa que desejo inserir o id do funcionário que fez a venda, assim como o id do produto vendido. Os campos que tem chave estrangeria ficam como nulos e eu não consigo resolver isso. Já vi algumas situações parecidas mas não resolveu. Não sei o que falta, não sei o que preciso colocar, só sei que já to cansado de tentar resolver isso e aparentemente deve ser algo besta.

Agradeço muito a quem puder me ajudar, deixarei as classes do Model abaixo.

Print da requisição no Postman:

Tanto o funcionario_id como o produto_id ficam nulos. Isso acontece tanto no Postman como no MySQL.

FUNCIONÁRIO MODEL

package com.campomagico.apivendas.model;

import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;
import java.util.List;

@Entity(name = "funcionario")
@Table(name = "funcionario")
public class FuncionarioModel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "nome", nullable = false)
    private String nome;
    @Column(name = "cpf", nullable = false)
    private String cpf;
    @Column(name = "telefone", nullable = false)
    private String telefone;
    @Column(name = "datanascimento", nullable = false)
    private LocalDate datanascimento;
    @Column(name = "datacontratacao", nullable = false)
    private LocalDate datacontratacao;
    @Column(name = "situacao", nullable = false)
    private String situacao;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    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 getTelefone() {
        return telefone;
    }

    public void setTelefone(String telefone) {
        this.telefone = telefone;
    }

    public LocalDate getDatanascimento() {
        return datanascimento;
    }

    public void setDatanascimento(LocalDate datanascimento) {
        this.datanascimento = datanascimento;
    }

    public LocalDate getDatacontratacao() {
        return datacontratacao;
    }

    public void setDatacontratacao(LocalDate datacontratacao) {
        this.datacontratacao = datacontratacao;
    }

    public String getSituacao() {
        return situacao;
    }

    public void setSituacao(String situacao) {
        this.situacao = situacao;
    }
}

PRODUTO MODEL

package com.campomagico.apivendas.model;

import javax.persistence.*;
import java.io.Serializable;
import java.util.List;

@Entity(name = "produto")
@Table(name = "produto")
public class ProdutoModel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "nome", nullable = false)
    private String nome;

    @Column(name = "descricao", nullable = false)
    private String descricao;

    @Column(name = "valor", nullable = false)
    private Float valor;

    public String getNome() {
        return nome;
    }

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

    public String getDescricao() {
        return descricao;
    }

    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }

    public Float getValor() {
        return valor;
    }

    public void setValor(Float valor) {
        this.valor = valor;
    }

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }
}
6 respostas

VENDA MODEL

package com.campomagico.apivendas.model;


import javax.persistence.*;
import java.io.Serializable;
import java.time.LocalDate;

@Entity(name = "venda")
@Table(name = "venda")
public class VendaModel implements Serializable {

    private static final long serialVersionUID = 1L;

    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    @Column(name = "data", nullable = false)
    private LocalDate data;
    @Column(name = "quantidade", nullable = false)
    private Integer quantidade;
    @Column(name = "valorTotal", nullable = false)
    private Float valorTotal;

    public Long getId() {
        return id;
    }

    public void setId(Long id) {
        this.id = id;
    }

    public LocalDate getData() {
        return data;
    }

    public void setData(LocalDate data) {
        this.data = data;
    }

    public Integer getQuantidade() {
        return quantidade;
    }

    public void setQuantidade(Integer quantidade) {
        this.quantidade = quantidade;
    }

    public Float getValorTotal() {
        return valorTotal;
    }

    public void setValorTotal(Float valorTotal) {
        this.valorTotal = valorTotal;
    }

    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "funcionario_id")
    private FuncionarioModel funcionarioModel;


    @ManyToOne(fetch = FetchType.LAZY)
    @JoinColumn(name = "produto_id")
    private ProdutoModel produtoModel;

    public FuncionarioModel getFuncionarioModel() {
        return funcionarioModel;
    }

    public void setFuncionarioModel(FuncionarioModel funcionarioModel) {
        this.funcionarioModel = funcionarioModel;
    }

    public ProdutoModel getProdutoModel() {
        return produtoModel;
    }

    public void setProdutoModel(ProdutoModel produtoModel) {
        this.produtoModel = produtoModel;
    }
}

Oi Lucas,

você está recebendo nos controller os objetos model diretamente ao invés de utilizar dtos?

Posta aqui o código do seu controller

Oi Rodrigo, primeiramente agradeço o retorno. Estou um pouco confuso, segue minhas classes de controller abaixo. Detalhe: consigo usar o POST para inserir novo funcionário e venda normalmente.

FUNCIONÁRIO CONTROLLER


@RestController
@RequestMapping(value = "/funcionario", produces = MediaType.APPLICATION_JSON_VALUE)
public class FuncionarioController {

    @Autowired
    private FuncionarioRepository funcionarioRepository;

    @PostMapping
    public FuncionarioModel create (@RequestBody FuncionarioModel funcionarioModel){

        return funcionarioRepository.save(funcionarioModel);
    }

    @PutMapping
    public void update (@RequestBody FuncionarioModel funcionarioModel){
        if(funcionarioModel.getId() > 0)
            funcionarioRepository.save(funcionarioModel);
    }

    @GetMapping
    public List<FuncionarioModel> list(){
        return funcionarioRepository.findAll();
    }

    @DeleteMapping("/{id}")
    public void delete(@PathVariable Long id){
        funcionarioRepository.deleteById(id);
    }
}

PRODUTO CONTROLLER

@RestController
@RequestMapping(value = "/produto", produces = MediaType.APPLICATION_JSON_VALUE)
public class ProdutoController {

    @Autowired
    private ProdutoRepository produtoRepository;

    @PostMapping
    public ProdutoModel create (@RequestBody ProdutoModel produtoModel){
        return produtoRepository.save(produtoModel);
    }

    @PutMapping
    public void update (@RequestBody ProdutoModel produtoModel){
        if(produtoModel.getId() > 0)
        produtoRepository.save(produtoModel);
    }

    @GetMapping
    public List<ProdutoModel> list(){
        return produtoRepository.findAll();
    }

    @DeleteMapping("/{id}")
    public void delete (@PathVariable Long id){
        produtoRepository.deleteById(id);
    }
}

*VENDA CONTROLLER

@RestController
@RequestMapping(value = "/venda", produces = MediaType.APPLICATION_JSON_VALUE)
public class VendaController {

    @Autowired
    private VendaRepository vendaRepository;

    @PostMapping
    public VendaModel create (@RequestBody VendaModel vendaModel){
        return vendaRepository.save(vendaModel);
    }

    @PutMapping
    public void update (@RequestBody VendaModel vendaModel){
        if(vendaModel.getId() > 0)
        vendaRepository.save(vendaModel);
    }

    @GetMapping
    public List<VendaModel> list(){
        return vendaRepository.findAll();
    }

    @DeleteMapping("/{id}")
    public void delete (@PathVariable Long id){
        vendaRepository.deleteById(id);
    }
}

Opa, não criei DTO, recebo direto do model mesmo.

solução!

Ok.

Pela suas classes o JSON na verdade deveria estar assim:

{
"data" : "2022-06-19",
"quantidade" : 1,
"valorTotal" : 68.99,
"funcionarioModel" : {"id" : 1},
"produtoModel" : {"id" : 1}
}

Os nomes das propriedades no json devem ser iguais aos nomes dos atributos das classes no Java.

Cara, muito obrigado pela ajuda! Funcionou direitinho.