Ao enviar o formulario de pedidos via ajax os dados da entidade Order
estam chegando vazios.
Em minha aplicação estou utilizando Thymeleaf + Spring Boot+ AJAX
Classe Order.java
@Data
@Builder
@AllArgsConstructor
@NoArgsConstructor
@Entity
@Table(name="orders")
public class Order {
@Id
@GeneratedValue(strategy = GenerationType.IDENTITY)
@Column
private long id;
@ManyToOne
@JoinColumn(name = "userId")
private User user;
@OneToOne
@JoinColumn(name = "shippingId")
private Shipping shipping;
@OneToOne
@JoinColumn(name = "customerId")
private Customer customer;
@OneToOne
@JoinColumn(name = "paymentId")
private Payment payment;
@OneToMany(mappedBy = "order")
private List<OrderUpdate> orderUpdate;
@OneToMany(mappedBy = "order")
private List<OrderProduct> orderProduct;
@Column
@NotNull(message = "É necessário setar a data de criação")
@Temporal(value= TemporalType.TIMESTAMP)
private Date createdDate;
@Column
@Temporal(value= TemporalType.TIMESTAMP)
private Date dateUpdate;
@Enumerated(EnumType.STRING)
@Column
private OrderStatus orderStatus;
public Order(){}
public long getId() {
return this.id;
}
public void setId(long id) {
this.id = id;
}
public Customer getCustomer() {
return this.customer;
}
public void setCustomer(Customer customer) {
this.customer = customer;
}
public Payment getPayment() {
return this.payment;
}
public void setPayment(Payment payment) {
this.payment = payment;
}
public Shipping getShipping() {
return this.shipping;
}
public void setShipping(Shipping shipping) {
this.shipping = shipping;
}
public User getUser() {
return this.user;
}
public void setUser(User user) {
this.user = user;
}
public Date getCreatedDate() {
return this.createdDate;
}
public void setCreatedDate(Date createdDate) {
this.createdDate = createdDate;
}
public Date getDateUpdate() {
return this.dateUpdate;
}
public void setDateUpdate(Date dateUpdate) {
this.dateUpdate = dateUpdate;
}
public List<OrderUpdate> getOrderUpdate() {
return this.orderUpdate;
}
public void setOrderUpdate(List<OrderUpdate> orderUpdate) {
this.orderUpdate = orderUpdate;
}
public List<OrderProduct> getOrderProduct() {
return this.orderProduct;
}
public void setOrderProduct(List<OrderProduct> orderProduct) {
this.orderProduct = orderProduct;
}
public OrderStatus getOrderStatus() {
return this.orderStatus;
}
public void setOrderStatus(OrderStatus orderStatus) {
this.orderStatus = orderStatus;
}
}
O objeto que esta sendo enviado via ajax esta vindo da seguinte forma:
customer.email: "teste@teste.com"
customer.firstName: "Joao"
customer.id: 1
customer.lastName: "Smith"
customer.principalPhone: "+55 (55) 55555-5555"
customer.secondaryPhone: "+55 (55) 55555-5555"
id: 0
orderProduct: Array(2)
0:
orderProductComplement: Array(1)
0: {description: "vaso de vidro", unitaryValue: "25.00", quantity: "1", total: "25"}
product: {id: 1}
quantity: "2"
total: "246"
unitaryValue: "12.30"
1:
orderProductComplement: [{…}]
quantity: "2"
total: "50"
unitaryValue: "25.00"
payment.discount: "R$ 11,95"
payment.paymentMethod: "CARTAO_DEBITO"
payment.paymentStatus: "PAGO"
payment.shipping: ""
payment.subTotal: "R$ 99,60"
payment.total: "R$ 87,65"
shipping.date: "21/05/2021"
shipping.shippingAddress.id: 1
shipping.time: "12:00 - 20:00"
shippingOptions: "Moto"
Método aonde recebo os dados.
@PostMapping("newOrder/")
public ResponseEntity<?> processFormOrder(@Valid @RequestBody Order order, BindingResult bindingResult) {
AjaxResponse result = new AjaxResponse();
if (bindingResult.hasErrors()) {
return ResponseEntity.badRequest().body(bindingResult.getAllErrors());
} else {
// validar e inserir ordem no banco de dados
result.setMsg("Ordem gerada com sucesso!");
result.setType("create");
return ResponseEntity.ok(result);
}
}
Eu estou recebendo o objeto porem o mesmo esta chegando vazio, apenas recebo os produtos, veja na imagem abaixo:
Abaixo vou postar parte do meu formulario:
<form id="orderForm" th:action="@{/admin/vendas/newOrder/}" th:object="${order}" method="post">
<input type="hidden" th:field="*{id}" data-value-type="number">
<input type="hidden" class="hiddenIdCustomer" th:field="*{customer.id}" data-value-type="number">
...
<input class="form-control" type="text" placeholder="João" id="firstName" th:field="*{customer.firstName}">
<input class="form-control" type="text" placeholder="Souza" id="lastName" th:field="*{customer.lastName}">
<!--OS PRODUTOS -->
<input type="hidden" class="form-control hidIdProduct" name="orderProduct[][product][id]" data-value-type="number">
....
</form>
Unica diferença é que nos produtos não usei o atributo do thymeleaf th:field
. Até fiz um teste utilizando apenas o atributo name=""
no input como abaixo:
<input class="form-control" type="text" placeholder="João" id="firstName" name="customer[firstName]">
E ao fazer isso eu recebo o cliente com seu primeiro nome no caso, porém não queria utilizar o atributo do HTML e sim do do thymeleaf th:field
.
Desde já agradeço!