5
respostas

Erro 500 com java.lang.NullPointerException: text

Estou recebendo esse erro 500 no método POST no console do navegador e também aparece um exceção java.lang.NullPointerException: text. Se alguém passou por isso ou sabe resolver, eu agradeço!

Home Oferta

<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 alert alert-dark" >{{pedido.nomeProduto}}</div>

                <div class="card-body">
                    <div class="row">

                                <div>Produto</div>
                                <div><a 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="col-12 col-sm-8 mb-3">
                                <div class="row mt-3">
                                    <div class="col-md-5">Valor: <input class="form-control" v-model="pedido.valorNegociado" /> </div>
                                    <div class="col-md-5">Data de Entrega: <input class="form-control" v-model="pedido.dataDaEntrega" /> </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,
                                  dataDaEntrega: pedido.dataDaEntrega,
                                  valor: pedido.valorNegociado,
                                  comentario: pedido.comentario
                              })
                              .then(response => console.log(response));

                        }
                    }
                });
            }
        </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>
5 respostas

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;

    @ManyToOne(fetch = FetchType.LAZY)
    @JsonIgnore //o professor esqueceu de dizer que precisa disso pra não dar erro
    private User user;

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

    public List<Oferta> getOfertas() {
        return ofertas;
    }
    public void setOfertas(List<Oferta> ofertas) {
        this.ofertas = ofertas;
    }
    public User getUser() {
        return user;
    }
    public void setUser(User user) {
        this.user = user;
    }
    public StatusPedido getStatus() {
        return status;
    }
    public void setStatus(StatusPedido status) {
        this.status = status;
    }
    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 Long getId() {
        return id;
    }
    public void setId(Long id) {
        this.id = id;
    }
}

Oferta

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

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

import javax.persistence.Entity;
import javax.persistence.FetchType;
import javax.persistence.GeneratedValue;
import javax.persistence.GenerationType;
import javax.persistence.Id;
import javax.persistence.ManyToOne;

@Entity
public class Oferta {

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

    private BigDecimal valor;

    private LocalDate dataDaEntrega;

    private String comentario;

    @ManyToOne(fetch = FetchType.LAZY)
    private Pedido pedido;

    public Pedido getPedido() {
        return pedido;
    }

    public void setPedido(Pedido pedido) {
        this.pedido = pedido;
    }

    public Long getId() {
        return id;
    }

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

    public BigDecimal getValor() {
        return valor;
    }

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

    public LocalDate getDataDaEntrega() {
        return dataDaEntrega;
    }

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

    public String getComentario() {
        return comentario;
    }

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


}

OfertaRest

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

import java.util.Optional;

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(@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;
    }
}

RequisicaoNovaOferta

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

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

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

public class RequisicaoNovaOferta {

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

    private Long pedidoId;

    private String valor;

    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 getDataEntrega() {
        return dataDaEntrega;
    }

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

    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;
    }

}

Olá, Ricardo! Tudo bem?

Esse erro 500 com a exceção java.lang.NullPointerException: text pode ocorrer por diversos motivos, mas geralmente está relacionado a algum objeto que está nulo e está sendo utilizado em algum momento do código.

Pelo código que você postou, pode ser que o objeto "pedido" esteja nulo em algum momento, o que pode estar causando o erro. Sugiro que você verifique se todos os objetos estão sendo inicializados corretamente e se não há nenhum erro de digitação ou de lógica no código.

Espero ter ajudado 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