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: