3
respostas

Não aparece os erros no browser

** Eu li os outros tópicos, achei alguns empecilhos e arrumei todos, porém vi que ainda tenho problemas na aplicação **

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

Home

<!DOCTYPE html>
<html>
<head th:replace="~{base :: head}"></head>
<body onload="onLoad()">

    <div th:replace="~{base :: logo}"></div>

    <div class="container" id="ofertas">

    <div th:replace="~{base :: titulo('Faça sua oferta')}"></div>

        <div class="card mb-3" v-for="pedido in pedidos">

                <div class="card-header dark">{{pedido.nomeProduto}}</div>

            <div class="card-body">

                <div class="row">
                    <div class="col-12 col-sm-8 mb-3">
                        <div>Produto</div>
                            <div>
                                <a target="_blank" v-bind:href="pedido.urlProduto">{{pedido.nomeProduto}}</a>
                            </div>

                            <div>Descrição</div>
                            <div>
                                <textarea disabled class="form-control">{{pedido.descricao}}</textarea>
                            </div>

                            <div class="row mt-3">
                            <p>Oferta</p>
                            <div class="col-md-5">
                                Valor: <input v-bind:class="{'is-valid':pedido.erros.valor !==''}" v-model="pedido.valorNegociado" class="form-control"/>
                                <div v-if="pedido.erros.valor" class="invalid-feedback">{{pedido.erros.valor}}</div>
                            </div>
                            <div class="col-md-7">
                                Data de entrega: <input v-bind:class="{'is-valid':pedido.erros.dataDaEntrega !==''}" v-model="pedido.dataDaEntrega" class="form-control"/>
                                <div v-if="pedido.erros.dataDaEntrega" class="invalid-feedback">{{pedido.erros.dataDaEntrega}}</div>
                            </div>
                            <div>
                            <label>Comentário</label>
                                <textarea class="form-control mt-2" v-model="pedido.comentario"></textarea>
                            </div>
                        </div>
                        <button v-if="pedido.ofertaEnviada" class="btn btn-success mt-2">Oferta enviada</button>
                        <button v-else v-on:click="enviarOferta(pedido)" class="btn btn-primary mt-2">Ofertar</button>
                    </div>

                    <div class="col-12 col-sm-4">
                        <div>
                            <img class="img-thumbnail" v-bind:src="pedido.urlImagem"/>
                        </div>
                    </div>

                </div>
            </div>

        </div>
    </div>
    <script>
        function onLoad() {
            var app = new Vue({
                el: '#ofertas',
                data: {
                    pedidos : []
                },
                mounted () {
                    axios
                        ({
                            method:'get',
                            url:'http://localhost:8080/api/pedidos/aguardando',
                        })
                        .then(response => {
                            response.data.forEach(pedido => {
                                pedido.ofertaEnviada = false;
                                pedido.erros = {
                                        valor:'',
                                        dataDaEntrega:''
                                    }
                                })
                            this.pedidos = response.data
                            })
                },
                methods: {
                    enviarOferta: function(pedido) {
                        pedido.erros = {
                                valor:'',
                                dataDaEntrega:''
                        };

                        axios
                            ({
                                method:'post',
                                url:'http://localhost:8080/api/ofertas',
                                    data: {                            
                                        pedidoId: pedido.id,
                                        valor: pedido.valorNegociado,
                                        dataDaEntrega: pedido.dataDaEntrega,
                                        comentario: pedido.comentario
                                    }
                            })
                            .then(response => pedido.ofertaEnviada = true)
                            .catch(error => {
                                error.data.errors.forEach(error => {
                                pedido.erros[error.field] = error.defaultMessage;
                                })
                            })

                    }
                }
            });
        }
    </script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://unpkg.com/axios/dist/axios.min.js"></script>
</body>
</html>
3 respostas

** OfertasRest **

package br.com.alura.mvc.mudi.api;

import java.util.Optional;

import javax.validation.Valid;

import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.web.bind.annotation.PostMapping;
import org.springframework.web.bind.annotation.RequestBody;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RestController;

import br.com.alura.mvc.mudi.dto.RequisicaoNovaOferta;
import br.com.alura.mvc.mudi.model.Oferta;
import br.com.alura.mvc.mudi.model.Pedido;
import br.com.alura.mvc.mudi.repository.PedidoRepository;

@RestController
@RequestMapping("/api/ofertas")
public class OfertasRest {

    @Autowired
    private PedidoRepository pedidoRepository;

    @PostMapping
    public Oferta criaOferta(@Valid @RequestBody RequisicaoNovaOferta requisicao) {

        Optional<Pedido> pedidoBuscado = pedidoRepository.findById(requisicao.getPedidoId());

        if(!pedidoBuscado.isPresent()) {
            return null;
        }

        Pedido pedido = pedidoBuscado.get();

        Oferta nova = requisicao.toOferta();

            nova.setPedido(pedido);
            pedido.getOfertas().add(nova);

            pedidoRepository.save(pedido);

            return nova;
    }
}

*RequicaoNovaOferta *

package br.com.alura.mvc.mudi.dto;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.time.format.DateTimeFormatter;

import javax.validation.constraints.NotNull;
import javax.validation.constraints.Pattern;

import br.com.alura.mvc.mudi.model.Oferta;

public class RequisicaoNovaOferta {

    private static final DateTimeFormatter formatter = DateTimeFormatter.ofPattern("dd/MM/yyyy");

    private Long pedidoId;

    @Pattern(regexp="^\\d+(\\.\\d+{2})?$")
    @NotNull
    private String valor;

    @Pattern(regexp="^\\d{2}/\\s{2}/\\d{4}$")
    @NotNull
    private String dataDaEntrega;

    private String comentario;

    public Long getPedidoId() {
        return pedidoId;
    }

    public void setPedidoId(Long pedidoId) {
        this.pedidoId = pedidoId;
    }

    public String getValor() {
        return valor;
    }

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

    public String getDataDaEntrega() {
        return dataDaEntrega;
    }

    public void setDataDaEntrega(String dataDaEntrega) {
        this.dataDaEntrega = dataDaEntrega;
    }

    public String getComentario() {
        return comentario;
    }

    public void setComentario(String comentario) {
        this.comentario = comentario;
    }

    public Oferta toOferta() {
        Oferta oferta = new Oferta();
            oferta.setComentario(this.comentario);
            oferta.setDataDaEntrega(LocalDate.parse(this.dataDaEntrega, formatter));
            oferta.setValor(new BigDecimal(this.valor));
        return oferta;
    }
}

** Pedido **

package br.com.alura.mvc.mudi.model;

import java.math.BigDecimal;
import java.time.LocalDate;
import java.util.List;

import javax.persistence.CascadeType;
import javax.persistence.Entity;
import javax.persistence.EnumType;
import javax.persistence.Enumerated;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;
import javax.persistence.OneToMany;

import com.fasterxml.jackson.annotation.JsonIgnore;

@Entity
public class Pedido {

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

    private String nomeProduto;
    private BigDecimal valorNegociado;
    private LocalDate dataDaEntrega;

    private String urlProduto;
    private String urlImagem;
    private String descricao;

    @Enumerated(EnumType.STRING)
    private StatusPedido status;

    @JsonIgnore
    @ManyToOne(fetch = FetchType.EAGER)
    private User user;

    @JsonIgnore
    @OneToMany(cascade = CascadeType.ALL, mappedBy = "pedido", fetch = FetchType.LAZY)
    private List<Oferta> ofertas;

    // Getter and Setters

    public String getNomeProduto() {
        return nomeProduto;
    }
    public void setNomeProduto(String nomeProduto) {
        this.nomeProduto = nomeProduto;
    }
    public BigDecimal getValorNegociado() {
        return valorNegociado;
    }
    public void setValorNegociado(BigDecimal valorNegociado) {
        this.valorNegociado = valorNegociado;
    }
    public LocalDate getDataDaEntrega() {
        return dataDaEntrega;
    }
    public void setDataDaEntrega(LocalDate dataDaEntrega) {
        this.dataDaEntrega = dataDaEntrega;
    }
    public String getUrlProduto() {
        return urlProduto;
    }
    public void setUrlProduto(String urlProduto) {
        this.urlProduto = urlProduto;
    }
    public String getUrlImagem() {
        return urlImagem;
    }
    public void setUrlImagem(String urlImagem) {
        this.urlImagem = urlImagem;
    }
    public String getDescricao() {
        return descricao;
    }
    public void setDescricao(String descricao) {
        this.descricao = descricao;
    }
    public StatusPedido getStatus() {
        return status;
    }
    public void setStatus(StatusPedido status) {
        this.status = status;
    }

    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public List<Oferta> getOfertas() {
        return ofertas;
    }
    public void setOfertas(List<Oferta> ofertas) {
        this.ofertas = ofertas;
    }


}

Pelo que consegui visualizar no seu código, o erro ocorre pela falta da propriedade "response" no objeto error:

Código com falha:

         .catch(error => {
                 error.data.errors.forEach(error => {
                       pedido.erros[error.field] = error.defaultMessage;
                 })
         })

Correção:

         .catch(error => {
                 error.response.data.errors.forEach(error => {
                       pedido.erros[error.field] = error.defaultMessage;
                 })
         })