2011-03-17 17 views
8

Tôi đang cố gắng tuần tự hóa POJO thành JSON nhưng bị kẹt trong vấn đề tham chiếu vòng tròn. Tôi biết cách xử lý một đến nhiều và đảo ngược các mối quan hệ bằng cách sử dụng @JsonBackReference@JsonManagedReference.Làm thế nào để giải quyết tham chiếu vòng tròn trong json serializer gây ra bởi nhiều TO nhiều hibernate hai chiều lập bản đồ?

Vấn đề của tôi là quan hệ nhiều-nhiều chiều (ví dụ: sinh viên có thể có nhiều khóa học và mỗi khóa học có thể có nhiều sinh viên đăng ký), phụ huynh tham chiếu tài liệu tham khảo con và con về cha mẹ và tại đây serializer của tôi chết. Theo hiểu biết của tôi, tôi không thể sử dụng @JsonBackReference ở đây vì loại giá trị của thuộc tính phải là bean: nó không thể là Tập hợp, Bản đồ, Mảng hoặc điều tra.

Có thể một số người có thể tư vấn cho tôi cách xử lý tình huống này không?

Trả lời

8

Bạn có thể sử dụng @JsonIgnoreProperties("someField") trên một trong các mặt của quan hệ (chú thích là cấp độ lớp). Hoặc @JsonIgnore

+0

Điều này, cộng thêm một số bổ sung mà tôi sẽ đề cập bên dưới, giải quyết một vấn đề tương tự khá độc đáo đối với tôi. – jpitt42

-1

nếu bạn có các đối tượng bộ sưu tập để cho nó được

collection<object> listobj 

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

này nên làm việc và đối tượng bạn nhận được bây giờ có thể được json serialized và nó sạch

+0

Giải pháp .NET/LINQ không hoạt động trong Java/Spring – wrschneider

0

Bạn cũng có thể sử dụng bản đồ Dozer để chuyển đổi một POJO tới một trường Bản đồ và loại trừ. Ví dụ, nếu chúng ta có hai lớp PojoA và PojoB có mối quan hệ hai chiều, chúng tôi xác định bản đồ như thế này

<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> 

Sau đó, bạn xác định một bean thiết lập các tập tin bản đồ dozer trên như một tài sản.

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

Sau đó, trong lớp mà nơi bạn đang serializing

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.

0

expounding vào những gì @Bozho đã đề cập ...

Tôi đang mắc kẹt với Jackson 1 ngay bây giờ bởi vì tôi đang sử dụng Google Cloud thiết bị đầu cuối, vì vậy đây vẫn có thể giúp một số người mặc dù Jackson 2 đã phải ngồi ngoài trong một thời gian. Mặc dù tôi không cần toàn bộ đối tượng deserialized, tham chiếu vẫn còn rất cần thiết.

Tôi đặt @JsonIgnore trên các trường gây tham chiếu vòng tròn, nhưng sau đó tạo trình khởi động mới cho từng tham chiếu sao cho tham chiếu bằng phẳng vẫn được trả về trong API của tôi.

@JsonIgnore 
private FooClass foo; 

public String getFooKey() 
... 

Với Cloud Endpoints, kết quả là "fooKey" bằng phẳng được trả về trong tải trọng GET, trong khi bỏ "foo".

1

Khi @Bozho đã trả lời để sử dụng @JsonIgnoreProperties, hãy thử điều này, nó làm việc cho tôi.

Dưới đây là mô hình của tôi với @JsonIgnoreProperties:

@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>(); 
} 

Trong thuộc tính giá trị của @JsonIgnoreProperties, chúng ta cần phải cung cấp các loại thu tài sản của truy cập (liên quan) mô hình.

Các vấn đề liên quan