将原有的RMI服务调用的权限控制系统改写成Hession服务调用时,遇到了LazyInitializationException异常。此权限系统用的是ORM框架,分析产生此问题的原因是Hessian序列化对象时,此对象中包含Hibernate的集合映射,此时Hibernate的session已经关闭。<br / >
解决方法
针对Hibernate的PersistentCollection订制一个Serializer。
实现: 继承AbastractSerializer,重写WriteObject方法,再重写SerializerFactory,当对Hibernate 集合进行序列化的时候,使用定制化的序列化Class。
import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.AbstractSerializer;
import com.caucho.hessian.io.CollectionSerializer;
import com.caucho.hessian.io.MapSerializer;
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import org.hibernate.Hibernate;
import org.hibernate.collection.PersistentMap;
public class HibernateSerializer extends AbstractSerializer {
CollectionSerializer collectionSeiralizer = new CollectionSerializer();
MapSerializer mapSerializer = new MapSerializer();
@Override
public void writeObject(Object obj, AbstractHessianOutput out) throws IOException {
boolean init = Hibernate.isInitialized(obj);
if (init) {
out.writeObject(obj);
out.flush();
return;
}
if (PersistentMap.class.isAssignableFrom(obj.getClass())) {
//将没有初始化的Map序列化空的HashMap
mapSerializer.writeObject(new HashMap(), out);
} else {
//将没有初始化的List,Set等序列化为空的ArrayList
collectionSeiralizer.writeObject(new ArrayList(), out);
}
}
}
import com.caucho.hessian.io.HessianProtocolException;
import com.caucho.hessian.io.Serializer;
import com.caucho.hessian.io.SerializerFactory;
import org.hibernate.collection.PersistentCollection;
public class HibernateSerializerFactory extends SerializerFactory {
@Override
public Serializer getSerializer(Class cl) throws HessianProtocolException {
//Hibernate的集合API使用为HibernateSerializer序列化
if (PersistentCollection.class.isAssignableFrom(cl)) {
return new HibernateSerializer();
}
return super.getSerializer(cl);
}}