2013-05-30 32 views
7

我正嘗試用angularjs和springmvc來構建一個應用程序。我有兩個類省和Comunidad。 :如何使用jackson模塊休眠序列化延遲加載的實體?

@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 
............... 
} 

在我的控制器:

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

我得到這個錯誤: /* 沒有找到串行類org.hibernate.proxy.pojo.cglib.CGLIBLazyInitializer和
沒有屬性發現創建BeanSerializer(以避免異常,禁用
SerializationConfig.Feature.FAIL_ON_EMPTY_BEANS))(通過引用鏈: java.util.ArrayList [0] - > admin.domain.Provincia [「refC omunidad 「] - < admin.domain.Comunidad $$ EnhancerByCGLIB $$ 68ea9e6f [」 hibernateLazyInitializer「]) */

我有關於傑克遜模塊休眠github上讀的是解決
問題一個不錯的選擇: https://github.com/FasterXML/jackson-module-hibernate。 我包括在我的pom.xml

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

傑克遜模塊休眠的依賴,但我不知道在哪裏配置「Hibernate4Module.Feature.FORCE_LAZY_LOADING,真」。 我嘗試按照該頁面的指示http://blog.pastelstudios.com/2012/03/12/spring-3-1-hibernate-4-jackson-module-hibernate/

但我得到相同的錯誤。

有沒有人可以用簡單的例子來幫助我?

回答

10

你可以試試這個。它對我有幫助。

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

我有確切的問題,這裏是我的解決方案。

public class YourObjectMapper extends ObjectMapper { 

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

p/s:僅適用於1.9.x org.codehaus.jackson.map.ObjectMapper而非2.x傑克遜。

+2

傑克遜2.x中,使用 'ObjectMapper MAPPER =新ObjectMapper();'' MAPPER.configure(SerializationFeature.FAIL_ON_EMPTY_BEANS,FALSE);' 這就是說,無論這些答案似乎幫助我類似的問題。 – Marcus

3

這是我得到了它的工作,我使用RestEasy的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

哪些版本? –

+0

我應該提到......很久以前才能回溯。這可能是最近的版本,當我開始使用它們時,2015年初 – RoyB

+0

aight,我不確定,但我不認爲這適用於Jackson 2.x和RESTEasy Jackson 2提供商3.x.我需要其他人來測試它。 –