我正在嘗試使用Spring 3.x @ResponseBody
來生成json/xml響應,當存在多關係b/w表時,我使用JPA 2.0 ORM,然後json拋出LazyInitializationExceptionSpring @ResponseBody Json循環引用
如果我給「渴望獲取」,那麼它將進入循環參考。
我正在嘗試使用Spring 3.x @ResponseBody
來生成json/xml響應,當存在多關係b/w表時,我使用JPA 2.0 ORM,然後json拋出LazyInitializationExceptionSpring @ResponseBody Json循環引用
如果我給「渴望獲取」,那麼它將進入循環參考。
我最近遇到了類似的問題: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
基於此:
但使用ObjectMapper和其他類傑克遜來自傑克遜的2.0,而不是傑克遜1. *
聽起來像您正在將ORM管理的對象序列化爲JSON,但尚未初始化所有子關聯,導致LazyInitializationException
,因爲您的Controller沒有處理數據庫連接。兩個選擇:
在我的情況下,我有用戶和組與許多關係,如果我初始化用戶組中的子對象,然後該組有用戶作爲子對象,如果我初始化它將進入循環 – 2012-03-21 08:11:19
來看通過您的意見,只需創建一個自定義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" />
這可能不是你正在尋找的答案,但我也遇到了這個問題,我不得不通過編寫一個處理關係的自定義ObjectMapper和JsonSerializer來解決它。 – bvulaj 2012-03-15 20:33:38
任何人都可以解決我的問題,這仍然持有我的發展 – 2012-03-16 09:45:40
我看到兩個已發佈的解決方案。你有沒有嘗試過? – bvulaj 2012-03-20 20:49:08