2013-05-30 8 views
7

Ich versuche eine Anwendung mit angularjs und springmvc. aufzubauen. Ich habe zwei Klassen Provinz und Comunidad. :Wie lazy-geladene Entitäten mit Jackson-Modul Hibernate serialisieren?

@Entity(name="Provincia") 
@Table(name="T_PROVINCIA") 
public class Provincia implements Serializable{ 


private String idProvincia; 
private String nombre;  
private Comunidad refComunidad; 

public Provincia() { 
} 

@Id 
@TableGenerator(name="provinciaGen", 
       table="T_GENERATOR", 
       pkColumnName="ID_GENERATOR", 
       pkColumnValue="ID_PROVINCIA", 
       valueColumnName="ID_VALUE") 
@GeneratedValue(generator="provinciaGen",strategy=GenerationType.TABLE) 
@Column(name="ID_PROVINCIA") 
public String getIdProvincia() { 
    return idProvincia; 
} 

@Column(name="NOMBRE") 
public String getNombre() { 
    return nombre; 
} 

@ManyToOne(targetEntity=Comunidad.class, fetch=FetchType.LAZY) 
@JoinColumn(name="ID_COMUNIDAD") 
public Comunidad getRefComunidad() { 
    return refComunidad; 
} 
setters 
..... 
..... 
} 

@Entity(name="Comunidad") 
@Table(name="T_COMUNIDAD") 
public class Comunidad implements Serializable{ 

@Id 
@TableGenerator(name="comunidadGen", 
       table="T_GENERATOR", 
       pkColumnName="ID_GENERATOR", 
       pkColumnValue="ID_COMUNIDAD", 
       valueColumnName="ID_VALUE") 
@GeneratedValue(generator="comunidadGen",strategy=GenerationType.TABLE) 
@Column(name="ID_COMUNIDAD") 
private String idComunidad; 

@Column(name="NOMBRE") 
private String nombre; 

@Column(name="SHORTNAME") 
private String shortName; 

public Comunidad() { 
} 

getters and setters 
............... 
} 

In meinem Controller:

@RequestMapping("/userlist.json") 
public @ResponseBody List<Provincia> getUserList(){ 
    return this.provinciaService.loadAllProvincias(); 
} 

Und ich bekomme diesen Fehler: /* Kein Serializer für Klasse org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer und
keine Immobilien gefunden entdeckt, um BeanSerializer zu erstellen (um eine Ausnahme zu vermeiden, deaktivieren Sie SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS)) (über die Referenzkette: java.util.ArrayList [0] -> admin.domain.Provincia ["refC omunidad "] - < admin.domain.Comunidad $$ EnhancerByCGLIB $$ 68ea9e6f [" hibernateLazyInitializer "]) */

ich auf Github über jackson Modul Hibernate gelesen haben, ist eine gute Wahl, um die
Problem zu lösen: https://github.com/FasterXML/jackson-module-hibernate. I umfasste die jackson Modul Hibernate Abhängigkeit in meinem pom.xml

<dependency> 
     <groupId>com.fasterxml.jackson.datatype</groupId> 
     <artifactId>jackson-datatype-hibernate4</artifactId> 
     <version>2.2.0</version> 
</dependency> 

Aber ich weiß nicht, wo die "Hibernate4Module.Feature.FORCE_LAZY_LOADING, true" konfigurieren. Ich versuche, die Anzeigen von dieser Seite http://blog.pastelstudios.com/2012/03/12/spring-3-1-hibernate-4-jackson-module-hibernate/

zu folgen, aber ich erhalte den gleichen Fehler.

Gibt es jemanden, der mir mit einem einfachen Beispiel helfen kann?

Antwort

10

Sie können dies versuchen. Es hilft mir.

ObjectMapper mapper = new ObjectMapper(); 

Hibernate4Module hbm = new Hibernate4Module(); 
hbm.enable(Hibernate4Module.Feature.FORCE_LAZY_LOADING); 

mapper.registerModule(hbm); 
ObjectWriter w = mapper.writer(); 
String result = null; 
try { 
    result = w.writeValueAsString(o); 
} catch (JsonProcessingException e) { 
    e.printStackTrace(); 
} 
0

Ich habe das genaue Problem und hier ist meine Lösung.

public class YourObjectMapper extends ObjectMapper { 

    @PostConstruct 
    public void afterPropertiesSet() throws Exception { 
     getSerializationConfig().set(SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS, false); 
    } 
} 

p/s: Nur gültig für 1.9.x org.codehaus.jackson.map.ObjectMapper und nicht Jackson 2.x.

+2

Für Jackson 2.x verwenden 'ObjectMapper MAPPER = new ObjectMapper();' ' MAPPER.configure (SerializationFeature.FAIL_ON_EMPTY_BEANS, false);' das heißt, keine dieser Antworten schien meine ähnliches Problem zu helfen. – Marcus

3

Dies ist, wie ich habe es funktioniert, ich bin mit Resteasy auf JBoss Wildfly

@Provider 
@Produces(MediaType.APPLICATION_JSON) 
public class JacksonConfig implements ContextResolver<ObjectMapper> { 
    @Override 
    public ObjectMapper getContext(Class<?> type) { 
     ObjectMapper mapper = new ObjectMapper(); 
     mapper.registerModule(new Hibernate4Module()); 
     return mapper; 
    } 
} 
+0

Welche Versionen? –

+0

Ich hätte erwähnen sollen ... Zu lange zurück zu verfolgen. Es waren wahrscheinlich neuere Versionen, als ich anfing, sie zu verwenden, Anfang 2015 – RoyB

+0

Aight, ich bin mir nicht sicher, aber ich denke nicht, dass dies in Jackson 2.x und RESTEasy Jackson 2 Provider 3.x funktioniert. Ich brauche jemanden, der es ebenfalls testet. –

Verwandte Themen