2012-03-15 35 views
5

Tôi đang cố gắng sử dụng Spring 3.x @ResponseBody để tạo phản hồi json/xml, tôi đang sử dụng JPA 2.0 ORM khi có nhiều mối quan hệ b/w bảng sau đó json đang ném LazyInitializationExceptionSpring @ResponseBody Json Tham khảo chu kỳ

Nếu tôi cung cấp "tìm nạp háo hức" thì nó sẽ đi vào tham chiếu tuần hoàn.

+0

Đây có thể không phải là câu trả lời bạn đang tìm kiếm, nhưng tôi cũng đã gặp vấn đề này và tôi phải giải quyết nó bằng cách viết một 'ObjectMapper' và' JsonSerializer' tùy chỉnh xử lý mối quan hệ. – bvulaj

+0

ai cũng có thể đưa ra giải pháp cho vấn đề của tôi, điều này vẫn đang giữ sự phát triển của tôi –

+0

Tôi thấy hai giải pháp đã được đăng. Bạn đã thử chưa? – bvulaj

Trả lời

3

Gần đây tôi đã gặp phải một vấn đề tương tự: Jackson - serialization of entities with birectional relationships (avoiding cycles)

Vì vậy, giải pháp là nâng cấp lên Jackson 2.0, và thêm vào các lớp học chú thích sau:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
        property = "@id") 
public class SomeEntityClass ... 

Sau đó, vấn đề là mùa xuân không hoạt động với Jackson 2.0. Điều này đã được giải quyết theo cách sau:

<bean id="jacksonMessageConverter" 
      class="own.implementation.of.MappingJacksonHttpMessageConverter"/> 

<bean class="org.springframework.web.servlet.mvc 
      .annotation.AnnotationMethodHandlerAdapter"> 
     <property name="messageConverters"> 
      <list> 
       <ref bean="jacksonMessageConverter"/> 
      </list> 
     </property> 
     <property name="requireSession" value="false"/> 
    </bean> 

own.implementation.of.MappingJacksonHttpMessageConverter được dựa trên này:

http://www.jarvana.com/jarvana/view/org/springframework/spring-web/3.0.0.RELEASE/spring-web-3.0.0.RELEASE-sources.jar!/org/springframework/http/converter/json/MappingJacksonHttpMessageConverter.java?format=ok

Nhưng sử dụng ObjectMapper và các lớp Jackson khác từ Jackson 2.0 thay vì Jackson 1. *

1

Có vẻ như bạn đang sắp xếp một đối tượng được quản lý ORM thành JSON, nhưng chưa khởi tạo tất cả các liên kết con, dẫn đến LazyInitializationException, vì Bộ điều khiển của bạn không có xử lý đối với kết nối DB. 2 lựa chọn:

  1. Khởi tạo tất cả các hiệp hội con của các đối tượng trong lớp DAO
  2. Chuyển đổi đối tượng ORM được quản lý bởi một ĐỂ và thông qua đó để điều khiển cho chuyển đổi sang JSON
+0

Trong trường hợp của tôi, tôi có người dùng và nhóm có nhiều mối quan hệ, nếu tôi khởi tạo nhóm con trong người dùng thì nhóm đó người dùng làm đối tượng con nếu tôi khởi tạo rằng nó sẽ đi vào chu kỳ –

3

Đánh giá theo nhận xét của bạn, chỉ cần tạo một tuỳ chỉnh Serializer.

JsonSerializer của bạn. Bạn có thể có những điều này cho từng loại đối tượng mà bạn đang cố gắng sắp xếp theo thứ tự.

public class MyObjectJsonSerializer extends JsonSerializer<MyObject> { 

@Override 
public Class<MyObject> handledType() { 
    return MyObject.class; 
} 

@Override 
public void serialize(MyObject myObject, JsonGenerator jgen, SerializerProvider provider) throws IOException, JsonProcessingException { 
    jgen.writeStartObject(); 
    jgen.writeNumberField("id", myObject.getId()); 
    // whatever else you need 
    jgen.writeEndObject(); 
} 

}

bạn ObjectMapper.

public class MyObjectMapper extends ObjectMapper { 

public MyObjectMapper() { 
    SimpleModule module = new SimpleModule("My Module", new Version(1, 0, 0, "SNAPSHOT")); 
    module.addSerializer(new MyObjectJsonSerializer()); 

    this.registerModule(module); 
} 

}

Và sau đó vào mùa xuân-config.xml của bạn.

<mvc:annotation-driven> 
    <mvc:message-converters> 
     <bean class="org.springframework.http.converter.json.MappingJacksonHttpMessageConverter"> 
      <property name="objectMapper" ref="myObjectMapper" /> 
     </bean> 
    </mvc:message-converters> 
</mvc:annotation-driven> 

<bean id="myObjectMapper" class="com.manne.app.objectmapper.MyObjectMapper" /> 
Các vấn đề liên quan