2012-03-02 2 views
2

Резюме: Можно ли использовать Джексон для двунаправленных ссылок с полиморфными типами, где @JsonTypeInfo также используется?Как обрабатывать двунаправленные ссылки с полиморфными типами и JSON?

примечание в нижней части this page состояний нет, но она была написана в 2010 году и применяется Джексон v1.6.0, так что я надеюсь, может быть, что-то изменилось или кто-то может предложить альтернативный подход .

фона: Я получаю ошибку JsonMappingException: Infinite recursion с помощью библиотеки Джексона и JPA. Я знаю, что могу добавить @JsonIgnore как suggested here, но недостатком является то, что я теряю двунаправленную связь, когда объекты JPA сериализуются/десериализуются.

Jackson v1.6.0 представил @JsonManagedReference и @JsonBackReference аннотации. Это выглядит великолепно, но documentation с 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;} 
} 

ответ

2

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

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

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

+0

спасибо за предложение. Я проверю это – Justin