2012-03-15 15 views
5

Sto cercando di utilizzare primavera 3.x @ResponseBody per generare risposta JSON/XML, io sto usando JPA 2.0 ORM quando v'è molti-molti relazione b/w tavoli poi JSON è gettando LazyInitializationExceptionPrimavera @ResponseBody JSON ciclico Riferimento

Se io do "eager fetch" allora sta andando in riferimento ciclico.

+0

Questa potrebbe non essere la risposta che stai cercando, ma ho anche incontrato questo problema, e ho dovuto risolverlo scrivendo un oggetto personalizzato 'ObjectMapper' e' JsonSerializer' che si occupava di relazione. – bvulaj

+0

qualcuno può dare una soluzione al mio problema, questo è ancora in attesa del mio sviluppo –

+0

Vedo due soluzioni che sono state pubblicate. Hai provato entrambi? – bvulaj

risposta

3

Recentemente ho incontrato un problema simile: Jackson - serialization of entities with birectional relationships (avoiding cycles)

Quindi la soluzione è quella di effettuare l'aggiornamento a Jackson 2.0, e aggiungere alle classi la seguente annotazione:

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

Allora il problema è che la primavera non funziona con Jackson 2.0. Questo è stato risolto nel seguente modo:

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

E la own.implementation.of.MappingJacksonHttpMessageConverter è sulla base di questo:

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

Ma usare ObjectMapper e altre classi Jackson da Jackson 2.0 al posto di Jackson 1. *

1

Sembra che si stia serializzando un oggetto gestito da ORM su JSON, ma non sono state inizializzate tutte le associazioni figlio, portando allo LazyInitializationException, poiché il controller non ha un handle per la connessione DB. 2 scelte:

  1. inizializzare tutte le associazioni dei bambini degli oggetti nello strato DAO
  2. convertire l'oggetto ORM gestiti ad un TO e passare che per il controller per la conversione in JSON
+0

Nel mio scenario ho utenti e gruppi con molte-molte relazioni, se inizializzo oggetti figlio di gruppo in utente, poi di nuovo quel gruppo ha utenti come oggetti figlio se inizializzo che andrà in ciclo –

3

giudicare dai tuoi commenti, basta creare un numero personalizzato Serializer.

Il tuo JsonSerializer. Puoi avere questi per ogni tipo di oggetto che stai cercando di serializzare.

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

}

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

}

E poi nella vostra 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" /> 
Problemi correlati