Spring+Hibernate整合Hessian
2019独角兽企业重金招聘Python工程师标准>>>
软件环境: JDK1.6、Spring3.0.5、Hibernate3.2.2、Hessian3.1.5
参考Spring Documents:中文|英文
服务端:
###1. remoting-servlet.xml <!-- 扫描并加注HessianService使用的bean --> <context:annotation-config /> <!-- <context:component-scan base-package="com.**" /> -->
<!--Hessian 启动BeanNameMapping 映射功能,以httpRequest作为处理Adapter-->
<!-- <beanclass="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"><property name="defaultHandler" ref="httpRequestHandlerAdapter" />
</bean> --><!-- Hessian 方式以Http进行传递 -->
<!-- <bean id="httpRequestHandlerAdapter" class="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter" /> --><!-- 解决Hibernate实体对象bean中集合对象延迟加载lazyLoad,导致Hessian客户端抛出no session or session closed异常的问题 -->
<bean id="lazySerializer" class="com.test.webservice.LazyHibernateSerializerFactory"></bean><!-- UnifiedUser -->
<bean id="unifiedUserService" class="com.test.manager.impl.UnifiedUserServiceImpl" />
<bean name="/UnifiedUserService" class="org.springframework.remoting.caucho.HessianServiceExporter"><property name="serializerFactory" ref="lazySerializer"/><property name="service" ref="unifiedUserService" /><property name="serviceInterface" value="com.test.manager.UnifiedUserService"/>
</bean>
###2. LazyHibernateSerializerFactory实现
参考: https://github.com/resthub/spring-amqp-hessian/issues/5
引用: http://code.google.com/p/rich-hibernate-lazy/wiki/HessianWithLazyHibernate
import java.io.IOException;
import java.util.ArrayList;
import java.util.HashMap;
import java.util.HashSet;
import java.util.List;
import java.util.Set;import org.hibernate.Hibernate;
import org.hibernate.collection.PersistentList;
import org.hibernate.collection.PersistentMap;
import org.hibernate.collection.PersistentSet;import com.caucho.hessian.io.AbstractHessianOutput;
import com.caucho.hessian.io.CollectionSerializer;
import com.caucho.hessian.io.HessianProtocolException;
import com.caucho.hessian.io.JavaSerializer;
import com.caucho.hessian.io.MapSerializer;
import com.caucho.hessian.io.Serializer;
import com.caucho.hessian.io.SerializerFactory;/*** 处理:Hessian远程调用时,对象序列化hibernate实体bean中集合对象延迟加载问题 ,* 采取将集合对象替换为空集合。* **/
public class LazyHibernateSerializerFactory extends SerializerFactory {public static String versionString = org.hibernate.Version.getVersionString();@Overridepublic Serializer getSerializer(Class cls) throws HessianProtocolException {try {if(versionString.startsWith("3") &&Class.forName("org.hibernate.collection.PersistentCollection").isAssignableFrom(cls)){return new LazySerializerForHibernate3(cls); }else if(versionString.startsWith("4") && Class.forName("org.hibernate.collection.spi.PersistentCollection").isAssignableFrom(cls)){return new LazySerializerForHibernate4(cls); }} catch (ClassNotFoundException e) {e.printStackTrace();}return super.getSerializer(cls);}
}class LazySerializerForHibernate3 extends JavaSerializer {public LazySerializerForHibernate3(Class cls) {super(cls);}CollectionSerializer collectionSeiralizer = new CollectionSerializer();MapSerializer mapSerializer = new MapSerializer();/*** @Title: writeObject* @Description: TODO(override hessian write)* @param @param object* @param @param out* @param @throws IOException* @return void* @throws*/@SuppressWarnings("unchecked")@Overridepublic void writeObject(Object object, AbstractHessianOutput out)throws IOException {boolean ifHaveInit = Hibernate.isInitialized(object);Object obj = convertPersistent(object);if (ifHaveInit && object!=null) {out.writeObject(obj); out.flush();return;}if (PersistentMap.class.isAssignableFrom(object.getClass())) {mapSerializer.writeObject(new HashMap(), out);} else {collectionSeiralizer.writeObject(new ArrayList(), out);}}@SuppressWarnings("unchecked")public static List convertListFromPersistentList(PersistentList plist) {List list = new ArrayList();if (plist != null) {for (int i = 0; i < plist.size(); i++) {list.add(plist.get(i));}}return list;}@SuppressWarnings("unchecked")public static Set convertSetFromPersistentSet(PersistentSet pset){Set set = new HashSet();if (pset != null) {for (int i = 0; i < pset.size(); i++) {set.add(pset.toArray()[i]);}}return set;}public static Object convertPersistent(Object obj){if(obj.getClass().isAssignableFrom(PersistentSet.class)){return convertSetFromPersistentSet((PersistentSet)obj);}else if (obj.getClass().isAssignableFrom(PersistentList.class)){return convertListFromPersistentList((PersistentList)obj);}else{return obj;}}
}class LazySerializerForHibernate4 extends JavaSerializer {public LazySerializerForHibernate4(Class cls) {super(cls);}CollectionSerializer collectionSeiralizer = new CollectionSerializer();MapSerializer mapSerializer = new MapSerializer();/*** @Title: writeObject* @Description: TODO(override hessian write)* @param @param object* @param @param out* @param @throws IOException* @return void* @throws*/@SuppressWarnings("unchecked")@Overridepublic void writeObject(Object object, AbstractHessianOutput out)throws IOException {boolean ifHaveInit = Hibernate.isInitialized(object);if (ifHaveInit) {out.writeObject(object);out.flush();return;}try {if (Class.forName("org.hibernate.collection.internal.PersistentMap").isAssignableFrom(object.getClass())) {mapSerializer.writeObject(new HashMap(), out);} else {collectionSeiralizer.writeObject(new ArrayList(), out);}} catch (ClassNotFoundException e) {// TODO Auto-generated catch blocke.printStackTrace();}}
}
###3. web.xml 中添加
<filter><filter-name>osivFilter</filter-name><filter-class>org.springframework.orm.hibernate3.support.OpenSessionInViewFilter</filter-class>
</filter><!-- Hessian --><!-- 解决 Hibernate session 在Hessian客户端序列化对象前提前关闭问题 -->
<filter-mapping><filter-name>osivFilter</filter-name><url-pattern>/remoting/*</url-pattern>
</filter-mapping><!-- Hessian -->
<servlet><servlet-name>hessian</servlet-name><servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class><init-param><param-name>contextConfigLocation</param-name><param-value>/WEB-INF/config/application-context.xml,/WEB-INF/config/remoting-servlet.xml</param-value></init-param>
</servlet>
<servlet-mapping><servlet-name>hessian</servlet-name><url-pattern>/remoting/*</url-pattern>
</servlet-mapping>
客户端:
###1. HessianClient.java
<!-- lang: java -->
import com.caucho.hessian.client.HessianProxyFactory;
import service.UnifiedUserMng;public class HessianClient {public static void main(String[] args) throws Exception {// 远程调用地址String url = "http://localhost:8080/remoting/UnifiedUserService";// 默认写法HessianProxyFactory factory = new HessianProxyFactory(); // 实例化UnifiedUserService base = (UnifiedUserService) factory.create(UnifiedUserMng.class, url);// 调用接口,并打印结果System.out.println(base.getByUsername("admin").getEmail());}
}
总结
Hibernate抛出no session or session closed原因:Hessian调用服务器服务,序列化Hibernate持久化对象中集合对象(Set)时,session已经关闭。参考
转载于:https://my.oschina.net/dexterman/blog/148309
Spring+Hibernate整合Hessian相关推荐
- Java程序员从笨鸟到菜鸟之(七十九)细谈Spring(八)spring+hibernate整合基本详解
由于spring和hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...
- flex3+blazeds+spring+hibernate整合小结
近来flex盛行,因此这两天也借了本书看了两天,发觉作为非页面设计人员,flex 还是很好的,flex builder很好用,拖拉就 有很COOL的界面了,而且flex总的来说基本东西不难学,有编程基 ...
- Spring+Hibernate整合
因为整合spring和hibernate所以,需要用到spring里面复写Hibernate的类以有DI和IOC特性 db.sql hibernate_basic数据库 表 person 字段 pid ...
- Struts+Spring+Hibernate整合入门详解
标签: strutshibernatespringbeanactionimport 2007-08-12 16:05 36280人阅读 评论(13) 收藏 举报 分类: STRUTS&SPRI ...
- 解决问题(七)——jsf+spring+hibernate整合(一)
jsf+spring+hibernate整合,于struts+spring+hibernate整合的过程非常相似(就不截图了,可以参考第一篇文章),但是前者相对于后者稍微麻烦一些. 第一步:初步整合, ...
- Spring、Struts2+Spring+Hibernate整合步骤
所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...
- spring mvc+spring + hibernate 整合(二)
在上篇文章中,我建立了工程并配置了spring + hibernate.今天我们检验下上篇文章的成果,如何检查呢?那就是进行单元测试.本篇文章就让大家和我一起来就前面的建的工程进行单元测试. 本项目使 ...
- JSF Spring Hibernate 整合:JSH1
JSF1.1 + Spring2.0 + Hibernate3.1 项目图示: JSF1.1 Jar包: MyFaces1.1 Jar包: Spring与Hibernate包的配置与文章 web.xm ...
- struts+spring+hibernate整合小例子
项目结构图 地址:http://www.blogjava.net/xiaoyi/articles/xiaoyi_ssh.html 包 com.yz.dao.impl package com.yz.da ...
最新文章
- WAF果真是个好东西
- 机器学习初学者公众号下载资源汇总(一)
- python中module的意思_python中module的意思
- java数组 —(8)
- nginx将ip+端口号映射为域名
- JQ基础练习---图片划过变暗
- Java依赖多个版本,java – Gradle中的多个依赖项版本
- 一dubbo框架学前原理介绍
- MySQL的jar包下载
- GIS技巧100例25-ArcGIS之shp文件修复
- phpstudy的安装及pikachu渗透平台的搭建
- 特教学校计算机课,北京特教学校引入编程课 计算机语言为听障孩子打开一扇智能之门...
- github上成员贡献量_精确统计github贡献者的代码行数
- 【11月18日截稿】【高校支持】第三届机器人、智能控制与人工智能国际学术会议-RICAI 2021...
- MATLAB导入LTspice RAW格式文件教程(绘制波特图)
- php array_diff_assoc,关于array_diff_assoc的详细介绍
- ac.find_template 踩坑,寻找相似图片,安卓自动化代码
- 量化交易接口怎么自动选股票?
- xiaopiu怎么导出html,xiaopiu原型工具
- jz2440——点亮led