Solucionado (ver solução)
Solucionado
(ver solução)
1
resposta

Erro 500 em nova oferta

boa tarde, não consigo criar uma nova oferta, refiz a aula e na hora de criar nova oferta ele retorna um erro 500. Segue abaixo o erro e códigos:

Erro

2021-01-27 16:04:41.623 ERROR 17674 --- [nio-8080-exec-7] o.a.c.c.C.[.[.[/].[dispatcherServlet]    : Servlet.service() for servlet [dispatcherServlet] in context with path [] threw exception [Request processing failed; nested exception is java.lang.NullPointerException: text] with root cause

java.lang.NullPointerException: text
    at java.base/java.util.Objects.requireNonNull(Objects.java:247) ~[na:na]
    at java.base/java.time.format.DateTimeFormatter.parse(DateTimeFormatter.java:1948) ~[na:na]
    at java.base/java.time.LocalDate.parse(LocalDate.java:428) ~[na:na]
    at br.com.alura.mvc.mudi.dto.RequisicaoNovaOferta.toOferta(RequisicaoNovaOferta.java:59) ~[classes/:na]
    at br.com.alura.mvc.mudi.api.OfertasRest.criarOferta(OfertasRest.java:32) ~[classes/:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke0(Native Method) ~[na:na]
    at java.base/jdk.internal.reflect.NativeMethodAccessorImpl.invoke(NativeMethodAccessorImpl.java:62) ~[na:na]
    at java.base/jdk.internal.reflect.DelegatingMethodAccessorImpl.invoke(DelegatingMethodAccessorImpl.java:43) ~[na:na]

oferta/home

<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,
                                        dataDaEntrega: pedido.dataDaEntrega, 
                                        comentario: pedido.comentario
                                    })
                                    .then(response => console.log(reponse));
                            }
                        }
                    });
        }
    </script>

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 criarOferta(@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.text.DateFormat;
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 dataDeEntrega;

    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 getDataDeEntrega() {
        return dataDeEntrega;
    }

    public void setDataDeEntrega(String dataDeEntrega) {
        this.dataDeEntrega = dataDeEntrega;
    }

    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.setDataDeEntrega(LocalDate.parse(this.dataDeEntrega, formatter ));
        oferta.setValor(new BigDecimal(this.valor));

        return oferta;
    }


}
1 resposta
solução!

No primeiro momento, errei a variável em vez de colocar dataDeEntrega coloquei dataDaEntrega. Corrigido isso entrei em outro erro, que era muito extenso e não pegava o começo do log no console, o começo do erro era esse a abaixo:

at com.fasterxml.jackson.databind.ser.BeanPropertyWriter.serializeAsField(BeanPropertyWriter.java:728) ~[jackson-databind-2.11.2.jar:2.11.2] at com.fasterxml.jackson.databind.ser.std.BeanSerializerBase.serializeFields(BeanSerializerBase.java:755) ~[jackson-databind-2.11.2.jar:2.11.2]

pesquisando vi que esse erro ele entra em um erro recursivo na hora serilizar pedido em Oferta. E encontrei a um link que dá sugestão de três maneiras, segue o link:

https://pt.stackoverflow.com/questions/242288/infinite-recursion-stackoverflowerror-erro-ao-listar-produtos-com-categorias

No meu caso utilizei @JsonIgnore no relacionamento de Oferta Pedido.

Oferta.java

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@Entity
public class Oferta {

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

    private BigDecimal valor; 

    private LocalDate dataDeEntrega;

    private String comentario;

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

E como na classe pedido tem um relacionamento idêntico de Pedido para User, tbm coloquei nele e ficou assim:

Pedido.java

@JsonIgnoreProperties({"hibernateLazyInitializer", "handler"})
@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
    private User user;

Com isso voltou a funcionar como estava na aula.