繁体   English   中英

泽西岛JAX-RS,休眠和LazyInitializationException

[英]Jersey JAX-RS, Hibernate and LazyInitializationException

我正在使用Java EE 6.0 RESTful应用程序,并且正在使用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)的情况下执行此操作? 如果有适当的方法,我不喜欢这种黑客手段。

我已经尝试使用Collections做到这一点。 因此,我将用于休眠的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 如果没有初始化collections,则将其写为空数组,否则将被序列化。

(迭代器来自Google Guava lib)

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM