【问题标题】:Spring @ResponseBody Json Cyclic ReferenceSpring @ResponseBody Json 循环参考
【发布时间】:2012-04-01 09:45:31
【问题描述】:

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

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

【问题讨论】:

  • 这可能不是你要找的答案,但我也遇到过这个问题,我不得不通过编写自定义ObjectMapperJsonSerializer 来解决它处理关系。
  • 任何人都可以解决我的问题,这仍然是我的发展
  • 我看到已发布的两个解决方案。你也试过了吗?
  • 我没有尝试过的自定义包装器,它是我试图考虑的最后一个选项,是的,我正在调用初始化孩子的方法 - 比如 user.getGroups() - 其中组具有多对多关系和它再次具有我无法初始化的 userList,因为它会再次导致循环问题。
  • 您的回复正文中是否需要所有这些参考资料?

标签: java spring spring-mvc jackson bidirectional-relation


【解决方案1】:

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

  1. 在 DAO 层中初始化所有对象的子关联
  2. 将 ORM 管理的对象转换为 TO 并将其传递给 Controller 以转换为 JSON

【讨论】:

  • 在我的场景中,我有具有多对多关系的用户和组,如果我在用户中初始化组子对象,那么如果我初始化它将进入循环,则该组再次将用户作为子对象
【解决方案2】:

根据您的 cmets 判断,只需创建一个自定义 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" />

【讨论】:

    【解决方案3】:

    我最近遇到了类似的问题:Jackson - serialization of entities with birectional relationships (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

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

    【讨论】:

      猜你喜欢
      • 1970-01-01
      • 2013-06-27
      • 1970-01-01
      • 1970-01-01
      • 2014-02-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多