2012-03-15 19 views
5

Estoy intentando utilizar 3.x primavera @ResponseBody para generar respuesta JSON/xml, estoy usando JPA 2.0 ORM cuando hay muchos-muchos relación b/w tablas a continuación, json está lanzando LazyInitializationExceptionprimavera @ResponseBody Json cíclica Referencia

Si le doy "fetch fetch", entonces va a la referencia cíclica.

+0

Puede que esta no sea la respuesta que está buscando, pero también me he encontrado con este problema y he tenido que resolverlo escribiendo un 'ObjectMapper' personalizado y' JsonSerializer' que tratan sobre la relación. – bvulaj

+0

¿Alguien puede darme una solución a mi problema, esto sigue teniendo mi desarrollo? –

+0

Veo dos soluciones que se han publicado. ¿Lo has probado? – bvulaj

Respuesta

3

me encontré recientemente un problema similar: Jackson - serialization of entities with birectional relationships (avoiding cycles)

Así que la solución es actualizar a Jackson 2,0, y añadir a las clases de la siguiente anotación:

@JsonIdentityInfo(generator = ObjectIdGenerators.IntSequenceGenerator.class, 
        property = "@id") 
public class SomeEntityClass ... 

Entonces, el problema es que la primavera no funciona con Jackson 2.0. Esto ha sido resuelto de la siguiente manera:

<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> 

Y el own.implementation.of.MappingJacksonHttpMessageConverter está basado en esto:

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

Pero utilizar ObjectMapper y otras clases de Jackson Jackson 2.0 en lugar de Jackson 1. *

1

Parece que está serializando un objeto gestionado por ORM a JSON, pero no ha inicializado todas las asociaciones secundarias, lo que lleva al LazyInitializationException, ya que su controlador no tiene un control para la conexión de base de datos. 2 opciones:

  1. inicializar todos los de las asociaciones de niño de los objetos en la capa DAO
  2. convertir el objeto ORM gestionados a una TO y pase que al controlador para la conversión a JSON
+0

En mi escenario tengo usuarios y grupos con muchas relaciones, si inicializo objetos secundarios grupales en usuario, entonces ese grupo nuevamente usuarios como objetos secundarios si inicializo que entrará en ciclo –

3

juzgar por sus comentarios, simplemente cree un Serializer personalizado.

Su JsonSerializer. Puedes tener estos para cada tipo de objeto que intentas serializar.

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

}

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

}

Y luego, en su primavera-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" /> 
Cuestiones relacionadas