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.