Java Jersey JAX-RS、Hibernate和LazyInitializationException

Java Jersey JAX-RS、Hibernate和LazyInitializationException,java,hibernate,jax-rs,Java,Hibernate,Jax Rs,我正在开发一个JavaEE6.0RESTful应用程序,我正在使用Hibernate。我需要在序列化之前取消代理我的延迟加载对象(实际上是实体的延迟加载实体属性),以避免LazyInitializationException。我已经用AMF服务成功地做到了这一点,在序列化实体之前编写了一些实用程序 我正在使用Jersey JAX-RS实现,我需要用Jackson来实现。我在BeanSerializer中找到了一个地方,我相信可以在那里进行代理,它工作得很好,但我需要以这种方式更改库类,我不想这样

我正在开发一个JavaEE6.0RESTful应用程序,我正在使用Hibernate。我需要在序列化之前取消代理我的延迟加载对象(实际上是实体的延迟加载实体属性),以避免LazyInitializationException。我已经用AMF服务成功地做到了这一点,在序列化实体之前编写了一些实用程序

我正在使用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)的情况下实现这一点?如果有合适的方法,我不喜欢这种黑客行为。

我已经尝试过这样做,尤其是在收藏方面。因此,我在我的ObjectMapper中添加了hibernate的PersistenceBag的新序列化程序:

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);
simpleModule.addSerializer(PersistentBag.class,新的JsonSerializer(){
@凌驾
公共void序列化(最终PersistentBag集合、最终JsonGenerator JsonGenerator、最终SerializerProvider SerializerProvider)引发IOException{
if(collection.wasInitialized()){
final Iterator Iterator=collection.Iterator();
//这样做是为了防止无限递归,因为如果我们写PersistenceBag,它将再次被序列化。
jsonGenerator.writeObject(Iterators.toArray(iterator,Object.class));
}否则{
//这样做是为了防止NPE和未定义的引用。(集合应为空,但不能为null)
jsongGenerator.writeStartArray();
jsonggenerator.writeEndArray();
}
}
});
registerModule(simpleModule);
这可防止出现懒洋洋的初始化异常。如果集合未初始化,则将其写入空数组,否则仅序列化


(迭代器来自Google Guava lib)

这篇文章可能会帮助你@richarbernal谢谢,但我不认为这会有什么帮助