Skip to content
Closed
Show file tree
Hide file tree
Changes from all commits
Commits
File filter

Filter by extension

Filter by extension

Conversations
Failed to load comments.
Loading
Jump to
Jump to file
Failed to load files.
Loading
Diff view
Diff view
Original file line number Diff line number Diff line change
@@ -0,0 +1,43 @@
package com.fasterxml.jackson.databind.deser;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.databind.DeserializationFeature;
import com.fasterxml.jackson.databind.ObjectMapper;
import com.fasterxml.jackson.databind.deser.cases.Animals3964;
import com.fasterxml.jackson.databind.testutil.DatabindTestUtil;
import org.junit.jupiter.api.Test;

import static org.junit.jupiter.api.Assertions.assertEquals;

// [databind#3964] MismatchedInputException, Bean not yet resolved
class JsonIdentityInfoAndBackReferencesTest extends DatabindTestUtil {

final ObjectMapper MAPPER = jsonMapperBuilder()
.enable(DeserializationFeature.FAIL_ON_UNKNOWN_PROPERTIES).build();

/**
* Passes : Testing lean without getters and setters
* and also without {@link JsonCreator}.
*/
@Test
void leanWithoutGetterAndSettersAndCreator() throws Exception {
String json = a2q("{" +
" 'id': 1," +
" 'squids': [" +
" {" +
" 'id': 2," +
" 'fish': 1," + // back reference
" 'shrimps': [" +
" {" +
" 'id': 3," +
" 'squid': 2" +
" }" +
" ]" +
" }" +
" ]" +
" }");

Animals3964.Fish fish = MAPPER.readValue(json, Animals3964.Fish.class);
assertEquals(fish, fish.squids.get(0).fish);
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,99 @@
package com.fasterxml.jackson.databind.deser.cases;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import java.util.List;

public class Animals3964 {
/**
* Lean version that fails and Without getters and setters
*/
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Animal.class
)
public static class Animal {
public final int id;
public List<Cat> cats;

@JsonCreator
public Animal(@JsonProperty("id") int id, @JsonProperty("cats") List<Cat> cats) {
this.id = id;
this.cats = cats;
}
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Cat.class
)
public static class Cat {
public int id;
public List<Food> foods;
@JsonBackReference("id")
public Animal animal;

@JsonCreator
public Cat(@JsonProperty("id") int id, @JsonProperty("foods") List<Food> foods) {
this.id = id;
this.foods = foods;
}
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Food.class
)
public static class Food {
public int id;
public Cat cat;

@JsonCreator
public Food(@JsonProperty("id") int id) {
this.id = id;
}
}

/**
* Passes : Testing lean without getters and setters
* and also without {@link JsonCreator}.
*/
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Fish.class
)
public static class Fish {
public int id;
public List<Squid> squids;
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Squid.class
)
public static class Squid {
public int id;
public List<Shrimp> shrimps;
@JsonBackReference("id")
public Fish fish;
}

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Shrimp.class
)
public static class Shrimp {
public int id;
public Squid squid;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,34 @@
package com.fasterxml.jackson.databind.deser.cases;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Calories3964.class
)
public class Calories3964 {
protected final int id;
protected Fruit3964 fruit;

@JsonCreator
public Calories3964(@JsonProperty("id") int id) {
this.id = id;
}

public int getId() {
return id;
}

public Fruit3964 getFruit() {
return fruit;
}

public void setFruit(Fruit3964 fruit) {
this.fruit = fruit;
}
}

Original file line number Diff line number Diff line change
@@ -0,0 +1,48 @@
package com.fasterxml.jackson.databind.deser.cases;

import com.fasterxml.jackson.annotation.JsonBackReference;
import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import java.util.List;

@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Fruit3964.class
)
public class Fruit3964 {
protected final int id;
protected List<Calories3964> calories;

@JsonBackReference("id")
protected Tree3964 tree;

@JsonCreator
public Fruit3964(@JsonProperty("id") int id, @JsonProperty("calories") List<Calories3964> calories) {
this.id = id;
this.calories = calories;
}

public int getId() {
return id;
}

public Tree3964 getTree() {
return tree;
}

public void setTree(Tree3964 tree) {
this.tree = tree;
}

public List<Calories3964> getCalories() {
return calories;
}

public void setCalories(List<Calories3964> calories) {
this.calories = calories;
}
}
Original file line number Diff line number Diff line change
@@ -0,0 +1,39 @@
package com.fasterxml.jackson.databind.deser.cases;

import com.fasterxml.jackson.annotation.JsonCreator;
import com.fasterxml.jackson.annotation.JsonIdentityInfo;
import com.fasterxml.jackson.annotation.JsonProperty;
import com.fasterxml.jackson.annotation.ObjectIdGenerators;

import java.util.List;

/**
* Original test
*/
@JsonIdentityInfo(
generator = ObjectIdGenerators.PropertyGenerator.class,
property = "id",
scope = Tree3964.class
)
public class Tree3964 {
protected final int id;
public List<Fruit3964> fruits;

@JsonCreator
public Tree3964(@JsonProperty("id") int id, @JsonProperty("fruits") List<Fruit3964> fruits) {
this.id = id;
this.fruits = fruits;
}

public int getId() {
return id;
}

public List<Fruit3964> getFruits() {
return fruits;
}

public void setFruits(List<Fruit3964> fruits) {
this.fruits = fruits;
}
}
Loading