我正在尝试使用 Spring 3.x@ResponseBody
生成 json/xml 响应,当存在多对多关系 b/w 表时,我使用 JPA 2.0 ORM,然后 json 抛出 LazyInitializationException
如果我给出“eager fetch”,那么它将进入循环引用。
我正在尝试使用 Spring 3.x@ResponseBody
生成 json/xml 响应,当存在多对多关系 b/w 表时,我使用 JPA 2.0 ORM,然后 json 抛出 LazyInitializationException
如果我给出“eager fetch”,那么它将进入循环引用。
从您的评论来看,只需创建一个自定义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);
}
}
然后在你的 spring-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" />
我最近遇到了一个类似的问题:Jackson - serialization of entity with birectional Relations (avoiding cycles)
所以解决方案是升级到 Jackson 2.0,并在类中添加以下注释:
@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class,
property = "@id")
public class SomeEntityClass ...
那么问题是 Spring 不适用于 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
基于此:
但是使用来自 Jackson 2.0 的 ObjectMapper 和其他 Jackson 类而不是 Jackson 1.*
听起来您正在将 ORM 管理的对象序列化为 JSON,但尚未初始化所有子关联,导致LazyInitializationException
,因为您的 Controller 没有数据库连接的句柄。2个选择: