Резюме: Есть ли у Джексона какой-либо способ обрабатывать двунаправленные ссылки с полиморфными типами, где также используется @JsonTypeInfo
?
Примечание внизу на этой странице утверждает, что нет, но оно было написано в 2010 году и применимо к Jackson v1.6.0, поэтому я надеюсь, что возможно что-то изменилось или кто-то может предложить альтернативный подход .
Справочная информация: Я получаю JsonMappingException: Infinite recursion
ошибку, используя библиотеку Джексона и JPA.Я знаю, что могу добавить @JsonIgnore
, как предложено здесь , но недостатком является то, что я теряю двунаправленную ассоциацию, когда сущности JPA сериализуются / десериализуются.
Джексон v1.6.0 представил @JsonManagedReference
и @JsonBackReference
аннотации.Это выглядит великолепно, но в документации от 2010 года конкретно говорится, что эти аннотации не работают с полиморфной обработкой с использованием @JsonTypeInfo
, что, конечно, то, что я имею.
Ниже приведен надуманный пример моегоклассы сущностей:
@Entity
public class Owner implements Serializable {
@Id
@GeneratedValue
@Column(name="owner_id")
private Long id;
@OneToMany(mappedBy="pet", orphanRemoval=true, cascade=CascadeType.ALL)
private List<Pet> pets;
public List<Pet> getPets() {return pets;}
public void setPets(List<Pet> pets) {this.pets = pets;}
}
@Entity
@DiscriminatorColumn(name="pet_type")
@JsonTypeInfo(
use = JsonTypeInfo.Id.NAME,
include = JsonTypeInfo.As.PROPERTY,
property = "type")
@JsonSubTypes({
@Type(value = Dog.class, name = "dog"),
@Type(value = Cat.class, name = "cat"),
@Type(value = Bird.class, name = "bird") })
public class Pet implements Serializable {
@Id
@GeneratedValue
@Column(name="pet_id")
private Long id;
@ManyToOne
@JoinColumn(name="owner_id")
private Owner owner;
//@JsonIgnore
public Owner getOwner() {return owner;}
public void setOwner(Owner owner) {this.owner = owner;}
}