8
respostas

Método PUT não atualiza o campo data

Estou desenvolvendo um projeto em paralelo e semelhante ao do curso. Criei o método PUT no meu controler e está atualizando os dados solicitados exceto a data. Não estou conseguindo enchergar onde está o detalhe. Poderiam me ajudar, por favor?

Classe Controller:

package com.minascafe.api.controllers;

import com.minascafe.api.entities.CafeCoco;
import com.minascafe.api.record.DadosAtualizacaoCafeCoco;
import com.minascafe.api.record.DadosCadastroCafeCoco;
import com.minascafe.api.record.DadosListagemCafeCoco;
import com.minascafe.api.repositories.CafeCocoRepository;
import jakarta.validation.Valid;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.data.domain.Page;
import org.springframework.data.domain.Pageable;
import org.springframework.http.HttpStatus;
import org.springframework.http.ResponseEntity;
import org.springframework.transaction.annotation.Transactional;
import org.springframework.web.bind.annotation.*;

@RestController//Endpoint (página web) de Controller
@RequestMapping("cafecoco") //Define a url da classe
public class CafeCocoController {

    public static final Logger log = LoggerFactory.getLogger(CafeCocoController.class);

    @Autowired
    private CafeCocoRepository cafe_coco; //Injetando o Repository como sendo um atributo

    @PostMapping
    @Transactional//Unidade de trabalho isolada que leva o banco de dados de um estado consistente a outro estado consistente
    public void cadastrar(@RequestBody @Valid DadosCadastroCafeCoco cc){ //RequestBody = Busca do corpo da requisição
        cafe_coco.save(new CafeCoco(cc)); //Salva um novo objeto entidade JPA do tipo CafeCoco passando os
        // parâmetros que vêm do Json da requisição no construtor da Entidade CafeCoco

        System.out.print("Lote de café em côco salvo no banco com sucesso!");
    }

    @GetMapping
    public Page<DadosListagemCafeCoco> listar(Pageable paginacao){//Devolve uma lista de Café em Côco e informações sobre a paginação. É apenas leitura, não precisa da anotação @Transactional
      return cafe_coco.findAll(paginacao).map(DadosListagemCafeCoco::new);//map = Mapeamento. Converte uma lista de CafeCoco para uma lista de DadosListagemCafeCoco. stream() = controle de fluxo de dados. Abstração para expressar operações eficientes do estilo SQL em relação a uma coleção de dados
        //.toList() = converte para uma lista
        // cafe_coco.findAll devolve uma lista de cafe_coco e o retorno do método é uma lista de DadosListagemCafeCoco (é um Dto)
    }

    @GetMapping("/{lote}")
    public ResponseEntity<CafeCoco> ok(@PathVariable("lote") int lote){//No PathVariable o parâmetro é passado diretamente no corpo da requisição e esse valor faz parte do corpo da requisição
       CafeCoco cafeCoco = new CafeCoco();
        return ResponseEntity
                .status(HttpStatus.ACCEPTED)
                .body(cafeCoco);
    }

    @PutMapping //Realiza atualizações (Update) no cadastro
    @Transactional //Para fazer escrita no banco de dados de forma efetiva
    public void atualizar(@RequestBody @Valid DadosAtualizacaoCafeCoco da){
       var cafe = cafe_coco.getReferenceById(da.lote()); //Carrega o cadastro do café em coco pelo lote que está vindo pelo DTO
       cafe.atualizarInformacoes(da); //Chama os métodos para atualizar os dados baseado no DTO
    }
}

Classe record:

package com.minascafe.api.record;

import jakarta.validation.constraints.NotNull;

import java.util.Date;

public record DadosAtualizacaoCafeCoco(
        @NotNull
        Integer lote,
        String produtor,
        Date data,
        Integer catacao,
        String classificacao,
        String lancado,
        String meieiro,
        Integer numero_nota,
        String observacoes,
        Integer peneira,
        Integer porcentagem_meieiro,
        Integer porcentagem_produtor) {
}
8 respostas

Oi Edson!

Sugestão é não utilizar a classe Date e sim a classe LocalDate (para datas) ou LocalDateTime (para data com hora).

Manda aqui um print de como está o json enviado e também o código da entidade.

Exemplo de json utilizado:

{
    "lote": 14,
    "data": "2023-04-12",
    "produtor": "Marco DeLatesta",
    "catacao": "29",
    "classificacao": "Duro",
    "lancado": "Não",
    "meieiro": "Gilberto",
    "numero_nota": 11422,
    "observacoes": "Retirou do barracão!",
    "peneira": 18
}

Entity CafeCoco:


package com.minascafe.api.entities;

import java.io.Serializable;
import java.util.Date;
import com.minascafe.api.record.DadosAtualizacaoCafeCoco;
import com.minascafe.api.record.DadosCadastroCafeCoco;
import jakarta.persistence.Column;
import jakarta.persistence.Entity;
import jakarta.persistence.GeneratedValue;
import jakarta.persistence.GenerationType;
import jakarta.persistence.Id;
import jakarta.persistence.PrePersist;
import jakarta.persistence.PreUpdate;
import jakarta.persistence.Table;

@Entity //A classe é também uma entidade, a JPA estabelecerá a ligação entre a entidade e uma tabela de mesmo nome no banco de dados onde os dados de objetos desse tipo poderão ser persistidos
@Table(name = "cad_cafe_coco") //Define o nome da tabela no banco em que a entity representa (em caso de não ser o mesmo nome da Entity)
public class CafeCoco implements Serializable{

    private static final long serialVersionUID = -406989519679078047L;

    @Id //Chave primária = Spring criará e gerenciará os identificadores únicos da tabela "cad_cafe_coco"
    @GeneratedValue(strategy=GenerationType.IDENTITY)//Gera valores de maneira crescente iniciando pelo valor 1
    private int lote;

    private String produtor;
    private String apelido;
    private String status;
    private Date data;
    private int sacos;
    private double quilos;
    private int barracao;
    private String subproduto;
    private int numero_nota;
    private String classificacao;
    private int catacao;
    private int peneira;
    private String lancado;
    private String observacoes;
    private String referencia;
    private String meieiro;
    private String porcentagem_produtor;
    private String porcentagem_meieiro;

    public CafeCoco(DadosCadastroCafeCoco cc){
        this.produtor = cc.produtor();
        this.apelido = cc.apelido();
        this.data = cc.data();
        this.catacao = cc.catacao();
        this.barracao = cc.barracao();
        this.classificacao = cc.classificacao();
        this.lancado = cc.lancado();
        this.peneira = cc.peneira();
        this.numero_nota = cc.numero_nota();
        this.referencia = cc.referencia();
        this.status = cc.status();
        this.subproduto = cc.subproduto();
        this.sacos = cc.sacos();
        this.quilos = cc.quilos();
        this.observacoes = cc.observacoes();
        this.meieiro = cc.meieiro();
        this.porcentagem_meieiro = cc.porcentagem_meieiro();
        this.porcentagem_produtor = cc.porcentagem_produtor();
    }

    public CafeCoco(){
    }

    public int getLote() {
        return lote;
    }

    public void setLote(int lote) {
        this.lote = lote;
    }

    @Column (name = "produtor", nullable = false)
    public String getProdutor() {
        return produtor;
    }

    public void setProdutor(String produtor) {
        this.produtor = produtor;
    }

    @Column (name = "apelido", nullable = false)
    public String getApelido() {
        return apelido;
    }

    public void setApelido(String apelido) {
        this.apelido = apelido;
    }

    @Column (name = "status", nullable = true)
    public String getStatus() {
        return status;
    }

    public void setStatus(String status) {
        this.status = status;
    }

    @Column (name = "data", nullable = false)
    public Date getData() {
        return data;
    }

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

    @Column (name = "sacos", nullable = false)
    public int getSacos() {
        return sacos;
    }

    public void setSacos(int sacos) {
        this.sacos = sacos;
    }

    @Column (name = "quilos", nullable = false)
    public double getQuilos() {
        return quilos;
    }

    public void setQuilos(double quilos) {
        this.quilos = quilos;
    }

    @Column (name = "barracao", nullable = true)
    public int getBarracao() {
        return barracao;
    }

    public void setBarracao(int barracao) {
        this.barracao = barracao;
    }

    @Column (name = "subproduto", nullable = true)
    public String getSubproduto() {
        return subproduto;
    }

    public void setSubproduto(String subproduto) {
        this.subproduto = subproduto;
    }

    @Column (name = "numero_nota", nullable = true)
    public int getNumero_nota() {
        return numero_nota;
    }

    public void setNumero_nota(int numero_nota) {
        this.numero_nota = numero_nota;
    }

    @Column (name = "classificacao", nullable = true)
    public String getClassificacao() {
        return classificacao;
    }

    public void setClassificacao(String classificacao) {
        this.classificacao = classificacao;
    }

    @Column (name = "catacao", nullable = true)
    public int getCatacao() {
        return catacao;
    }    

    public void setCatacao(int catacao) {
        this.catacao = catacao;
    }

    @Column (name = "peneira", nullable = true)
    public int getPeneira() {
        return peneira;
    }

    public void setPeneira(int peneira) {
        this.peneira = peneira;
    }

    @Column (name = "lancado", nullable = true)
    public String getLancado() {
        return lancado;
    }

    public void setLancado(String lancado) {
        this.lancado = lancado;
    }

    @Column (name = "observacoes", nullable = true)
    public String getObservacoes() {
        return observacoes;
    }

    public void setObservacoes(String observacoes) {
        this.observacoes = observacoes;
    }

    @Column (name = "referencia", nullable = true)
    public String getReferencia() {
        return referencia;
    }

    public void setReferencia(String referencia) {
        this.referencia = referencia;
    }

    @Column (name = "meieiro", nullable = true)
    public String getMeieiro() {
        return meieiro;
    }

    public void setMeieiro(String meieiro) {
        this.meieiro = meieiro;
    }

    @Column (name = "porcentagem_produtor", nullable = true)
    public String getPorcentagem_produtor() {
        return porcentagem_produtor;
    }

    public void setPorcentagem_produtor(String porcentagem_produtor) {
        this.porcentagem_produtor = porcentagem_produtor;
    }

    @Column (name = "porcentagem_meieiro", nullable = true)
    public String getPorcentagem_meieiro() {
        return porcentagem_meieiro;
    }

    public void setPorcentagem_meieiro(String porcentagem_meieiro) {
        this.porcentagem_meieiro = porcentagem_meieiro;
    }

    /*@PreUpdate //executa o método anotado antes da entidade ser atualizada
    public void preUpdate() {
        data = new Date();
    }

    @PrePersist
    public void prePersistO() {
        final Date atual = new Date();
        data = atual;
    }*/

    @Override
    public String toString() {
        return "CafeCoco [lote=" + lote + ", produtor=" + produtor + ", apelido=" + apelido + ", status=" + status + ", data=" + data
                + ", sacos=" + sacos + ", quilos=" + quilos + ", barracao=" + barracao + ", subproduto=" + subproduto
                + ", numero_nota=" + numero_nota + ", classificacao=" + classificacao + ", catacao=" + catacao
                + ", peneira=" + peneira + ", lancado=" + lancado + ", observacoes=" + observacoes + ", referencia="
                + referencia + ", meieiro=" + meieiro + ", porcentagem_produtor=" + porcentagem_produtor
                + ", porcentagem_meieiro=" + porcentagem_meieiro + "]";
    }

    public void atualizarInformacoes(DadosAtualizacaoCafeCoco da) {
        if (da.data() != null){
            this.data = da.data();
        }
        if(da.produtor() != null) {
            this.produtor = da.produtor();
        }
        if(da.catacao() != null){
            this.catacao = da.catacao();
        }
        if(da.classificacao() != null){
            this.classificacao = da.classificacao();
        }
        if(da.lancado() != null){
            this.lancado = da.lancado();
        }
        if(da.meieiro() != null){
            this.meieiro = da.meieiro();
        }
        if(da.numero_nota() != null){
            this.numero_nota = da.numero_nota();
        }
        if(da.observacoes() != null){
            this.observacoes = da.observacoes();
        }
        if(da.peneira() != null){
            this.peneira = da.peneira();
        }
     }
    }

O código está ok. Coloca um system.out no método atualizarInformacoes, para ver qual valor está chegando:

public void atualizarInformacoes(DadosAtualizacaoCafeCoco da) {
    if (da.data() != null) {
        System.out.println("\n\n\n DATA ATUAL: " +this.data);
        System.out.println("NOVA DATA: " +da.data() +"\n\n\n");

        this.data = da.data();
    }

    //resto do código
}

Imprime desta forma:

 DATA ATUAL: 2023-04-12 00:00:00.0
NOVA DATA: Wed Apr 12 21:00:00 GMT-03:00 2023

Chegou a mesma data. Envie outra data no json para testar se vai atualizar.

Olá Rodrigo,

continua sem conseguir atualizar a data. Enviei outro json com

"data": "2023-04-06"

E continua imprimindo com a data anterior:

DATA ATUAL: 2023-04-05 00:00:00.0
NOVA DATA: Wed Apr 05 21:00:00 GMT-03:00 2023