1
resposta

Erro ao cadastrar Oferta

Recebo NullPointer na hora de cadastrar uma Oferta na classe OfertaDto. O erro se dá na linha

LocalDate data = LocalDate.parse(this.dataEntrega, formatador);

da classe OfertaDto. O atributo dataEntrega não é preenchido no envio da requisição, todos os outros atributos são preenchidos normalmente exceto a data. Segue abaixo o código da página home.hmtl

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

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

    <div class="container" id="ofertas">
        <div th:replace="~{base :: titulo('Últimos Pedidos')}"></div>

        <div class="card mb-3" v-for="pedido in pedidos">
            <div class="card-header alert-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" class="" v-bind:href="pedido.urlProduto">{{pedido.nomeProduto}}</a></div>
                        <div>Descrição</div>
                        <div><textarea disabled="disabled" class="form-control">{{pedido.descricao}}</textarea></div>
                        <div class="row mt-3">
                            <div class="col-md-5">Valor: <input class="form-control" v-model="pedido.valorNegociado" /></div>
                            <div class="col-md-7">Data da entrega: <input class="form-control" v-model="pedido.dataEntrega" /></div>
                        </div>
                        <div class="mt-2">
                            <label>Comentário</label>
                            <textarea class="form-control" v-model="pedido.comentario"></textarea>
                        </div>
                        <button v-on:click="enviarOferta(pedido)" class="btn btn-primary mt-2">Enviar Oferta</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
                              .get('http://localhost:8080/api/pedidos/aguardando')
                              .then(response => (this.pedidos = response.data))
                        },
                        methods: {
                            enviarOferta: function(pedido) {
                                axios
                                    .post('http://localhost:8080/api/ofertas', {
                                        pedidoId: pedido.id,
                                        valor: pedido.valorNegociado,
                                        dataEntrega: pedido.dataEntrega,
                                        comentario: pedido.comentario,
                                    })
                                    .then(resposta => console.log(response));
                            }
                        }
                });
        }
    </script>
    <script src="https://cdn.jsdelivr.net/npm/vue/dist/vue.js"></script>
    <script src="https://cdn.jsdelivr.net/npm/axios/dist/axios.min.js"></script>
</body>
</html>

Segue abaixo o código da OfertaDto

public class OfertaDto {

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

    private Long pedidoId;
    private String valor;
    private String dataEntrega;
    private String comentario;

    public Long getPedidoId() {return pedidoId;}

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

    public String getValor() {return valor;}

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

    public String getDataDaEntrega() {return dataEntrega;}

    public void setDataDaEntrega(String dataDaEntrega) {this.dataEntrega = 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);
        System.out.println("Data entrega: " + this.dataEntrega);
        System.out.println("Pedido ID: " + this.pedidoId);
        System.out.println("valor: " + this.valor);
        System.out.println("comentario: " + this.comentario);
        LocalDate data = LocalDate.parse(this.dataEntrega, formatador);
        oferta.setDataDaEntrega(LocalDate.parse(this.dataEntrega, formatador));
        oferta.setValor(new BigDecimal(this.valor));
        return oferta;
    }
}

Segue abaixo os atributos do código da classe Pedido

@Entity
public class Pedido {

    @Id @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;
    private String nomeProduto;
    private BigDecimal valorNegociado;
    private LocalDate dataEntrega;
    private String urlProduto;
    private String urlImagem;
    private String descricao;
    @OneToMany(mappedBy = "pedido", cascade = CascadeType.ALL, fetch = FetchType.LAZY)
    private List<Oferta> ofertas;

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

    @Enumerated(EnumType.STRING)
    private StatusPedido status = StatusPedido.AGUARDANDO;

Se alguem puder dar uma moral agredeço muito, já tentei de tudo e não consegui resolver.

1 resposta

E aí, Lucas. Beleza?

Mano, de cara mesmo, eu só percebi que o seu setter para inserir a data é diferente do atributo..

seu atributo é uma String dataEntrega o seu set é um setData'da'Entrega mesmo que o seu 'this' esteja referenciando o atributo correto, talvez haja um problema aí.

joga aqui a stacktrace do console pra ver se eu consigo te ajudar.

Um abraço e bons estudos =)

Quer mergulhar em tecnologia e aprendizagem?

Receba a newsletter que o nosso CEO escreve pessoalmente, com insights do mercado de trabalho, ciência e desenvolvimento de software