【问题标题】:Jersey JAX-RS, Hibernate and LazyInitializationExceptionJersey JAX-RS、Hibernate 和 LazyInitializationException
【发布时间】:2012-05-16 21:31:40
【问题描述】:

我正在开发一个 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)的情况下做到这一点?如果有适当的方法,我不喜欢这种黑客攻击。

【问题讨论】:

标签: java hibernate jax-rs


【解决方案1】:

我特别尝试使用 Collections 来做到这一点。所以我为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。如果 collections 没有初始化,则写为空数组,否则只是序列化。

(迭代器来自 Google Guava 库)

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2015-02-09
    • 1970-01-01
    • 2014-01-24
    • 2016-12-02
    • 1970-01-01
    • 2013-07-15
    相关资源
    最近更新 更多