Как обрабатывать двунаправленные ссылки с полиморфными типами и JSON? - PullRequest
2 голосов
/ 03 марта 2012

Резюме: Есть ли у Джексона какой-либо способ обрабатывать двунаправленные ссылки с полиморфными типами, где также используется @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;}
}

1 Ответ

2 голосов
/ 03 марта 2012

Это не немедленное решение, но Jackson 2.0.0 наконец-то получит поддержку полной обработки Object Id с использованием аннотации @JsonIdentityInfo.Документация все еще в процессе (страница должна быть this );но у модульных тестов есть достойные примеры.

Идея будет заключаться в том, чтобы указать типы, для которых требуется Object Id (или, альтернативно, указать свойства), а использование очень похоже на использование @JsonTypeInfo.

Jackson 2.0.0 RC1 был выпущен неделю назад, и есть надежда, что финальная версия 2.0.0 должна выйти до конца марта 2012 года.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...