1
resposta

Comparar duplicidade no Banco de Dados

Tô desenvolvendo uma API que possui um endpoint /v1/receitas do tipo POST, onde na requisição é enviado um JSON possuindo algumas informações como: descrição, data e valor. Gostaria que não salvasse no banco de dados caso houver duplicidade de duas descrições no mesmo mês, porém ao implementar toda essa lógica me retorna um erro(print).

Fiz uns testes e reparei que quando eu tiro o LocalDate ele funfa certinho.

controller:

package br.com.challenge.alura.controllers;


import javax.validation.Valid;

import org.springframework.beans.BeanUtils;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.cache.annotation.CacheEvict;
import org.springframework.cache.annotation.Cacheable;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.data.domain.Sort.Direction;
import org.springframework.data.web.PageableDefault;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
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.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.challenge.alura.dto.ReceitaDTO;
import br.com.challenge.alura.dto.ReceitaForm;
import br.com.challenge.alura.models.Receita;
import br.com.challenge.alura.services.ReceitaService;

@RestController
@RequestMapping("v1/receitas")
public class ReceitaController {

    @Autowired
    private ReceitaService receitaService;

    @PostMapping
    @CacheEvict(value = "receita", allEntries = true)
    public ResponseEntity<Object> salvar(@RequestBody @Valid ReceitaForm form){

        if(receitaService.duplicidade(form)) {
            return ResponseEntity.status(HttpStatus.CONFLICT).body("CONFLITO: Descrição duplicada no mesmo mês!");
        }

        Receita receita = new Receita();

        BeanUtils.copyProperties(form, receita);
        receitaService.save(receita);

        return ResponseEntity.status(HttpStatus.CREATED).body("Receita salva com sucesso!");
    }

DTO:

package br.com.challenge.alura.dto;



import java.time.LocalDate;

import javax.validation.constraints.NotBlank;
import javax.validation.constraints.NotNull;

import org.springframework.format.annotation.DateTimeFormat;

import lombok.Data;

@Data
public class ReceitaForm {

    @NotBlank(message = "O campo descrição deve ser preenchido!")
    private String descricao;

    @NotNull(message = "O campo valor não pode ser nulo!")
    private Double valor;

    @NotNull(message = "O campo data deve ser preenchido!")
    @DateTimeFormat(pattern = "dd/MM/yyyy")
    private LocalDate data;
}

service:

@Service
public class ReceitaService {

    @Autowired
    private ReceitaRepository receitaRepository;

    @Transactional
    public Receita save(Receita receita) {
        return receitaRepository.save(receita);
    }

    public boolean duplicidade(ReceitaForm form) {
            return receitaRepository.existsByDuplicidade(form.getDescricao(), form.getData());
    }

repository:

package br.com.challenge.alura.repositories;


import java.time.LocalDate;

import org.springframework.data.jpa.repository.JpaRepository;
import org.springframework.stereotype.Repository;

import br.com.challenge.alura.models.Receita;

@Repository
public interface ReceitaRepository extends JpaRepository<Receita, Long>{

    boolean existsByDuplicidade(String descricao, LocalDate data);

}

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

1 resposta

Olá, Aron! Tudo bem?

Poderia copiar e colar aqui o stacktrace completo do error?