5

我正在尝试使用 Spring 3.x@ResponseBody生成 json/xml 响应,当存在多对多关系 b/w 表时,我使用 JPA 2.0 ORM,然后 json 抛出 LazyInitializationException

如果我给出“eager fetch”,那么它将进入循环引用。

4

3 回答 3

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

}

然后在你的 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" />
于 2012-03-21T14:09:12.060 回答
3

我最近遇到了一个类似的问题: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基于此:

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

但是使用来自 Jackson 2.0 的 ObjectMapper 和其他 Jackson 类而不是 Jackson 1.*

于 2012-04-10T16:14:50.177 回答
1

听起来您正在将 ORM 管理的对象序列化为 JSON,但尚未初始化所有子关联,导致LazyInitializationException,因为您的 Controller 没有数据库连接的句柄。2个选择:

  1. 初始化 DAO 层中所有对象的子关联
  2. 将 ORM 管理的对象转换为 TO 并将其传递给 Controller 以转换为 JSON
于 2012-03-18T14:39:14.083 回答