[英]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.