4
respostas

Erro ao executar POST API JAVA Spring

Estou tentando fazer a inclusão de uma nova venda, tenho alguns relacionamento com outras tabelas, estou recebendo a seguinte mensagem de erro :

2022-01-03 14:49:04.940 ERROR 12264 --- [nio-8080-exec-9] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is org.springframework.dao.InvalidDataAccessApiUsageException: The given id must not be null!; nested exception is java.lang.IllegalArgumentException: The given id must not be null!] with root cause

java.lang.IllegalArgumentException: The given id must not be null!
    at org.springframework.util.Assert.notNull(Assert.java:201) ~[spring-core-5.3.13.jar:5.3.13]
    at org.springframework.data.jpa.repository.support.SimpleJpaRepository.getById(SimpleJpaRepository.java:345) ~[spring-data-jpa-2.6.0.jar:2.6.0]
    at jdk.internal.reflect.GeneratedMethodAccessor159.invoke(Unknown Source) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]
    at java.base/java.lang.reflect.Method.invoke(Method.java:568) ~[na:na]
    at 

Porém não me mostra qual id está nulo, como saber ?

4 respostas

Segue a classe modelo Venda

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Venda {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Integer idVenda;
    private LocalDateTime dataVenda = LocalDateTime.now();

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "comprador_id")
    private Comprador comprador;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "categoria_id")
    private Categoria categoria;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "local_id")
    private Local local;

    @JsonIgnore
    @ManyToOne
    @JoinColumn(name = "pagamento_id")
    private Pagamento formaDePagamento;

    private Long valorTotal;

    public Venda() {
    }

    public Venda(Comprador comprador, Categoria categoria, Local local, Pagamento formaDePagamento, Long valorTotal) {
        this.comprador = comprador;
        this.categoria = categoria;
        this.local = local;
        this.formaDePagamento = formaDePagamento;
        this.valorTotal = valorTotal;
    }



    @Override
    public int hashCode() {
        return Objects.hash(comprador, dataVenda, idVenda);
    }


    public Integer getIdVenda() {
        return idVenda;
    }
    public void setIdVenda(Integer idVenda) {
        this.idVenda = idVenda;
    }
    public LocalDateTime getDataVenda() {
        return dataVenda;
    }
    public void setDataVenda(LocalDateTime dataVenda) {
        this.dataVenda = dataVenda;
    }
    public Comprador getComprador() {
        return comprador;
    }
    public void setComprador(Comprador comprador) {
        this.comprador = comprador;
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public void setCategoria(Categoria categoria) {
        this.categoria = categoria;
    }

    public Local getLocal() {
        return local;
    }

    public void setLocal(Local local) {
        this.local = local;
    }

    public Pagamento getFormaDePagamento() {
        return formaDePagamento;
    }

    public void setFormaDePagamento(Pagamento formaDePagamento) {
        this.formaDePagamento = formaDePagamento;
    }

    public Long getValorTotal() {
        return valorTotal;
    }

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

Segue a classe VendaDto

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class VendaDto {

    private Integer idVenda;
    private LocalDateTime dataVenda;
    private Categoria categoria;
    private Comprador comprador;
    private Local local;
    private Pagamento formaDePagamento;
    private Long valorTotal;

    public VendaDto(Venda venda) {
        this.idVenda = venda.getIdVenda();
        this.dataVenda = venda.getDataVenda();
        this.comprador = venda.getComprador();
        this.categoria = venda.getCategoria();
        this.local = venda.getLocal();
        this.formaDePagamento = venda.getFormaDePagamento();
        this.valorTotal = venda.getValorTotal();
    }

    public Integer getIdVenda() {
        return idVenda;
    }

    public LocalDateTime getDataVenda() {
        return dataVenda;
    }

    public Categoria getCategoria() {
        return categoria;
    }

    public Comprador getComprador() {
        return comprador;
    }

    public Local getLocal() {
        return local;
    }

    public Pagamento getFormaDePagamento() {
        return formaDePagamento;
    }

    public Long getValorTotal() {
        return valorTotal;
    }

    public static List<VendaDto> converter(List<Venda> vendas) {
        return vendas.stream().map(VendaDto::new).collect(Collectors.toList());
    }

Segue a classe VendaForm

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
public class VendaForm {

    private Integer idVenda; 
    private Integer id_comprador;
    private Integer idCategoria;
    private Integer idLocal;
    private Integer idFormaDePagamento;
    private Long valorTotal;



    public Integer getIdVenda() {
        return idVenda;
    }
    public void setIdVenda(Integer idVenda) {
        this.idVenda = idVenda;
    }
    public Integer getId_comprador() {
        return id_comprador;
    }
    public void setId_comprador(Integer id_comprador) {
        this.id_comprador = id_comprador;
    }
    public Integer getIdCategoria() {
        return idCategoria;
    }
    public void setIdCategoria(Integer idCategoria) {
        this.idCategoria = idCategoria;
    }
    public Integer getIdLocal() {
        return idLocal;
    }
    public void setIdLocal(Integer idLocal) {
        this.idLocal = idLocal;
    }
    public Integer getIdFormaDePagamento() {
        return idFormaDePagamento;
    }
    public void setIdFormaDePagamento(Integer idFormaDePagamento) {
        this.idFormaDePagamento = idFormaDePagamento;
    }
    public Long getValorTotal() {
        return valorTotal;
    }
    public void setValorTotal(Long valorTotal) {
        this.valorTotal = valorTotal;
    }

    public Venda converter(VendasRepository vendasRepository, CategoriasRepository categoriasRepository,
        LocaisRepository locaisRepository, PagamentosRepository pagamentosRepository, CompradoresRepository compradoresRepository) {
        Categoria categoria = categoriasRepository.getById(idCategoria);
        Comprador comprador = compradoresRepository.getById(id_comprador);
        Local local = locaisRepository.getById(idLocal);
        Pagamento pagamento = pagamentosRepository.getById(idFormaDePagamento);
        System.out.println(id_comprador);
        return new Venda(comprador, categoria, local, pagamento, valorTotal);

    }

Segue a classe VendaController

@RestController
@CrossOrigin(origins = "http://localhost:4200", maxAge = 3600)
@RequestMapping("/vendas")
public class VendaController {

    @Autowired
    private VendasRepository vendasRepository;
    @Autowired
    private CategoriasRepository categoriasRepository;
    @Autowired
    private CompradoresRepository compradoresRepository;
    @Autowired
    private LocaisRepository locaisRepository;
    @Autowired
    private PagamentosRepository pagamentosRepository;

    @GetMapping
    public List<VendaDto> listarVendas() {
        List<Venda> vendas = vendasRepository.findAll();
        return VendaDto.converter(vendas);
    }

    @PostMapping
    public ResponseEntity<VendaDto> cadastrarVenda(@RequestBody @Valid VendaForm dados,
            UriComponentsBuilder uriBuilder) {
        Venda venda = dados.converter(vendasRepository, categoriasRepository, locaisRepository, pagamentosRepository,
                compradoresRepository);
        vendasRepository.save(venda);

        URI uri = uriBuilder.path("/venda/{id}").buildAndExpand(venda.getIdVenda()).toUri();
        return ResponseEntity.created(uri).body(new VendaDto(venda));
    }