2012-03-15 146 views
5

我正在嘗試使用Spring 3.x @ResponseBody來生成json/xml響應,當存在多關係b/w表時,我使用JPA 2.0 ORM,然後json拋出LazyInitializationExceptionSpring @ResponseBody Json循環引用

如果我給「渴望獲取」,那麼它將進入循環參考。

+0

這可能不是你正在尋找的答案,但我也遇到了這個問題,我不得不通過編寫一個處理關係的自定義ObjectMapper和JsonSerializer來解決它。 – bvulaj 2012-03-15 20:33:38

+0

任何人都可以解決我的問題,這仍然持有我的發展 – 2012-03-16 09:45:40

+0

我看到兩個已發佈的解決方案。你有沒有嘗試過? – bvulaj 2012-03-20 20:49:08

回答

3

我最近遇到了類似的問題:Jackson - serialization of entities with birectional relationships (avoiding cycles)

因此,解決辦法是升級到傑克遜2.0,並添加類以下注釋:

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

那麼問題在於春不適用於Jackson 2.0。這已經解決了以下方式:

<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基於此:

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

但使用ObjectMapper和其他類傑克遜來自傑克遜的2.0,而不是傑克遜1. *

1

聽起來像您正在將ORM管理的對象序列化爲JSON,但尚未初始化所有子關聯,導致LazyInitializationException,因爲您的Controller沒有處理數據庫連接。兩個選擇:

  1. 初始化所有的對象的子關聯的在DAO層
  2. 轉換的ORM管理對象到TO並傳遞到控制器,用於轉換到JSON
+0

在我的情況下,我有用戶和組與許多關係,如果我初始化用戶組中的子對象,然後該組有用戶作爲子對象,如果我初始化它將進入循環 – 2012-03-21 08:11:19

3

來看通過您的意見,只需創建一個自定義Serializer

您的JsonSerializer。你可以爲每個想要序列化的對象類型設置這些。

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

}

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

}

,然後在春天-config.xml中。

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