2011-03-17 20 views
8

POJO'yu JSON'a serileştirmeye çalışıyorum ancak döngüsel başvuru sorununa takıldım. @JsonBackReference ve @JsonManagedReference'u kullanarak bir çok kişiye nasıl işlem yapılacağını ve ilişkileri nasıl tersine çevireceğini biliyorum.Json serializerindeki dairesel referansı birçok neden olan çok sayıda çift yönlü haritalama neden çözümlenir?

Sorunum, iki yönlü çoktan çok ilişkiyle (örneğin, bir öğrencinin çok sayıda kursu ve her bir kursun kayıtlı olduğu çok öğrenci olabilir), üst başvurular alt öğeye ve altyazıya geri döndüğüne ve burada serileştiricimin ölmesine neden olmuştur. Anlayışım gereği, @JsonBackReference numaralı telefonu kullanamıyorum çünkü mülkün değeri, fasulye olmalıdır: Koleksiyon, Harita, Dizi veya numaralandırma olamaz.

Bazıları bu senaryoyu nasıl ele alabileceğimi bildirebilir mi?

cevap

8

@JsonIgnoreProperties("someField") numaralı bağlantıyı ilişkilerin kenarlarından birinde kullanabilirsiniz (ek not, sınıf düzeyi). Eğer koleksiyon nesnesi varsa Veya @JsonIgnore

+0

Bu, ayrıca aşağıda değineceğim bazı eklemeler, benim için de oldukça hoş bir benzer problemi çözdü. – jpitt42

-1

Bu işe ve json tefrika olabilir şimdi almak nesne ve gereken o

collection<object> listobj 

var jsonObj = from c in listobj 
        select new 
       { 
        Prop1 = c.Prop1 
        ... 
       } 

olalım onun temiz Ayrıca dönüştürmek için Dozer eşleme kullanabilirsiniz

+0

.NET/LINQ çözümü Java/Spring'te çalışmıyor – wrschneider

0

POJO'ya bir Harita ve alanları hariç tutun. Örneğin iki sınıfları PojoA ve PojoB çift yönlü ilişkileri olan varsa, biz bu

<mapping map-id="mapA" map-null="false"> 
    <class-a>com.example.PojoA</class-a> 
    <class-b>java.util.Map</class-b> 
    <field> 
    <a>fieldA</a> 
    <b>this</b> 
    </field> 
    <field map-id="mapB"> 
     <a>pojoB</a> 
     <b>this</b> 
     <b-hint>java.util.Map</b-hint> 
    </field> 
</mapping> 

<mapping map-id="mapB" map-null="false"> 
    <class-a>com.example.PojoB</class-a> 
    <class-b>java.util.Map</class-b> 
    <field-exclude> 
    <a>pojoA</a> 
    <b>this</b> 
    </field-exclude> 
</mapping> 

gibi haritalama Sonra bir özelliği olarak yukarıdaki dozer eşleme dosyası ayarı fasulye tanımla.

<bean id="mapper" class="org.dozer.DozerBeanMapper"> 
    <property name="mappingFiles"> 
    <list> 
     <value>dozerMapping.xml</value> 
    </list> 
    </property> 
</bean> 

Sonra sınıfta olduğunu sen

public class TestClass 
{ 
    @Autowired 
    DozerBeanMapper mapper; 

    public Map<String,Object> serializeObject(PojoA pojoA) 
    { 
      return ((Map<String, Object>) mapper.map(pojoA, Map.class, "mapA")); 
    } 
} 

Dozer manual here

seri nerede.

0

@Bozho önce bahsedildiği ne açımlamak ...

Google Cloud Endpoints kullanıyorum çünkü şu anda Jackson 1 takıldım, bu nedenle bu yine Jackson 2 dışarı geçmesine rağmen bazı insanlar yardımcı olabilecek bir süre için. Her ne kadar seri hale getirilmiş nesneye ihtiyacım olmasa da, referans hala çok gereklidir.

Dairesel başvuruya neden olan alanlara @JsonIgnore koydum, ancak her biri için yeni bir alıcı oluşturdum, böylece API'lerimde hala bir düz başvuru döndürülür. "Foo" ihmal ederken Bulut endpointi ile

@JsonIgnore 
private FooClass foo; 

public String getFooKey() 
... 

, düz "fooKey" bu sonuçlar, GET yükü içinde iade edilen.

1

@Bozho, @JsonIgnoreProperties kullanmak için cevap vermiştir, bunu deneyin, işe yaradı. Aşağıda

@JsonIgnoreProperties ile mankenlerim: @JsonIgnoreProperties value niteliği ise

@Entity 
public class Employee implements Serializable{ 
    @ManyToMany(fetch=`enter code here`FetchType.LAZY) 
    @JoinTable(name="edm_emp_dept_mappg", 
     joinColumns={@JoinColumn(name="emp_id", referencedColumnName="id")}, 
     inverseJoinColumns={@JoinColumn(name="dept_id", referencedColumnName="id")}) 
    @JsonIgnoreProperties(value="employee") 
    Set<Department> department = new HashSet<Department>(); 
} 


@Entity 
public class Department implements Serializable { 
    @ManyToMany(fetch=FetchType.LAZY, mappedBy="department") 
    @JsonIgnoreProperties(value="department") 
    Set<Employee> employee = new HashSet<Employee>(); 
} 

, biz tezgahın toplanması tipi özelliğini (ilgili) modeli sağlamak gerekir.

İlgili konular