2012-05-16 18 views
0

我正在使用Java EE 6.0 RESTful應用程序,並使用Hibernate。我需要在序列化之前取消代理我的惰性加載對象(實際上是實體的惰性加載的實體屬性)以避免LazyInitializationException。我通過在序列化實體之前編寫一些實用程序來成功實現AMF服務。Jersey JAX-RS,Hibernate和LazyInitializationException

我正在使用Jersey JAX-RS實現,我需要對Jackson執行此操作。我在BeanSerializer中發現了一個地方,我相信代理可以發生並且工作正常,但是我需要以這種方式更改一個庫類,而且我不想。

因此,這裏是我的變更後的BeanSerializer.serialize方法:

@Override 
public final void serialize(Object bean, JsonGenerator jgen, SerializerProvider provider) 
throws IOException, JsonGenerationException 
{ 
    bean = Util.deproxy(bean); // ***** Deproxy the bean here ***** 

    jgen.writeStartObject(); 

    if (_propertyFilterId != null) { 
    serializeFieldsFiltered(bean, jgen, provider); 
    } else { 
    serializeFields(bean, jgen, provider); 
    } 

    jgen.writeEndObject(); 
} 

我的問題是如何做到這一點不改變庫類(BeanSerializer)?我不喜歡這種黑客,如果有一個正確的方法。

+0

這篇文章可以幫助你http://stackoverflow.com/q/2216547/797704 – richarbernal

+0

@richarbernal感謝,但我不明白怎麼會幫助 – DaTroop

回答

0

我試過這樣做,特別是與收藏。所以,我已經添加了新的串行對Hibernate的PersistenceBag進入礦井ObjectMapper

simpleModule.addSerializer(PersistentBag.class, new JsonSerializer<PersistentBag>() { 
    @Override 
    public void serialize(final PersistentBag collection, final JsonGenerator jsonGenerator, final SerializerProvider serializerProvider) throws IOException { 
    if(collection.wasInitialized()){ 
     final Iterator iterator = collection.iterator(); 
     //this is done to prevent Infinite Recursion, cause if we write PersistenceBag it will be serialized again.   
     jsonGenerator.writeObject(Iterators.toArray(iterator,Object.class)); 
    }else{ 
     //this is done to prevent NPE and undefined reference. (collections should be empty, but not null) 
     jsonGenerator.writeStartArray(); 
     jsonGenerator.writeEndArray(); 
    } 
    } 
}); 
objectMapper.registerModule(simpleModule); 

這可以防止LazyInitializationException中。如果集合未初始化,則它被寫爲空數組,否則它只是被序列化。

(迭代器是谷歌番石榴LIB)

相關問題