2012-03-15 3 views
5

Я пытаюсь использовать Spring 3.x @ResponseBody, чтобы генерировать ответ JSON/XML, Я использую JPA 2.0 ОРМ, когда есть много-много отношение ч/б таблицы, то JSON бросает LazyInitializationExceptionПружина @ResponseBody Json Циклическая ссылка

Если я дам «нетерпеливую выборку», тогда он перейдет в циклическую ссылку.

+0

Возможно, это не тот ответ, который вы ищете, но я также столкнулся с этой проблемой, и мне пришлось ее решить, написав пользовательские «ObjectMapper» и «JsonSerializer», которые касались отношений. – bvulaj

+0

может кто-нибудь дать решение моей проблемы, это все еще держит мое развитие –

+0

Я вижу два решения, которые были опубликованы. Вы тоже пробовали? – bvulaj

ответ

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, так как ваш контроллер не имеет дескриптора соединения с БД. 2 варианта:

  1. Инициализировать все дочерние ассоциаций объектов в DAO слое
  2. Преобразование ORM управляемого объекта к TO и передать в контроллер для преобразования в формат JSON
+0

В моем сценарии у меня есть пользователи и группы со многими отношениями отношения, если я инициализирую дочерние объекты группы у пользователя, то снова эта группа имеет как дочерние объекты, если я инициализирую, что он перейдет в цикл –

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" /> 
Смежные вопросы