Preparei outro exemplo para ilustrar fora do ambiente Spring.
O Spring usa o Jackson para serializar e deserializar JSON, por isso eu o usei também.
Repare que no primeiro println
o client aparece como null
. Isso porque o JSON que a gente enviou não contem um valor para o campo “client” da Order e o Jackson simplesmente não tem como adivinhar o valor deste campo.
Neste exemplo o Jackson não acha o valor do campo “client” e por isso seta como null
.
{
"id": 1,
"name": "João",
"orders": [
{ "id": 1, "moment": "2019-01-21T05:47:26.853Z" }
]
}
Para ele achar, vc teria que fazer algo assim:
{
"id": 1,
"name": "João",
"orders": [
{
"id": 1,
"moment": "2019-01-21T05:47:26.853Z",
"client": { "id": 1, "name": "João" }
}
]
}
Já no segundo println
o client aparece corretamente, isto porque eu o setei “manualmente”.
Eu criei o exemplo com Gradle, este é o build.gradle
que usei:
plugins {
id 'application'
}
repositories {
mavenCentral()
}
dependencies {
implementation 'com.fasterxml.jackson.core:jackson-databind:2.15.0'
implementation 'com.fasterxml.jackson.datatype:jackson-datatype-jsr310:2.15.0'
}
application {
mainClass = 'Main'
}
Para executar, use o comando gradle run
. Testei com Java 17.
Este é o código:
Obs: Repare no método toString()
de Order
que eu usei client == null ? client : client.getName()
, isto porque senão dá aquele erro de referência ciclica e eu queria poder ver que o cliente está presente de alguma forma.
import java.time.LocalDate;
import java.util.Set;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.datatype.jsr310.JavaTimeModule;
class Order {
private int id;
private LocalDate moment;
private Client client;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public LocalDate getMoment() {
return moment;
}
public void setMoment(LocalDate moment) {
this.moment = moment;
}
public Client getClient() {
return client;
}
public void setClient(Client client) {
this.client = client;
}
@Override
public String toString() {
return "Order[id=%d, moment=%s, client=%s]".formatted(id, moment, client == null ? client : client.getName());
}
}
class Client {
private int id;
private String name;
private Set<Order> orders;
public int getId() {
return id;
}
public void setId(int id) {
this.id = id;
}
public String getName() {
return name;
}
public void setName(String name) {
this.name = name;
}
public Set<Order> getOrders() {
return orders;
}
public void setOrders(Set<Order> orders) {
this.orders = orders;
}
@Override
public String toString() {
return "Client[id=%d, name=%s, orders=%s]".formatted(id, name, orders);
}
}
class Main {
public static void main(String... args) throws Exception {
final var json = """
{
"id": 1,
"name": "João",
"orders": [
{ "id": 1, "moment": "2019-01-21T05:47:26.853Z" }
]
}
""";
final Client client = new ObjectMapper().registerModule(new JavaTimeModule()).readValue(json, Client.class);
System.out.println(client);
client.getOrders().forEach(order -> order.setClient(client));
System.out.println(client);
}
}