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相关推荐

  1. Java程序员从笨鸟到菜鸟之(七十九)细谈Spring(八)spring+hibernate整合基本详解

    由于spring和hibernate处于不同的层次,Spring关心的是业务逻辑之间的组合关系,Spring提供了对他们的强大的管理能力, 而Hibernate完成了OR的映射,使开发人员不用再去关心 ...

  2. flex3+blazeds+spring+hibernate整合小结

    近来flex盛行,因此这两天也借了本书看了两天,发觉作为非页面设计人员,flex 还是很好的,flex builder很好用,拖拉就 有很COOL的界面了,而且flex总的来说基本东西不难学,有编程基 ...

  3. Spring+Hibernate整合

    因为整合spring和hibernate所以,需要用到spring里面复写Hibernate的类以有DI和IOC特性 db.sql hibernate_basic数据库 表 person 字段 pid ...

  4. Struts+Spring+Hibernate整合入门详解

    标签: strutshibernatespringbeanactionimport 2007-08-12 16:05 36280人阅读 评论(13) 收藏 举报 分类: STRUTS&SPRI ...

  5. 解决问题(七)——jsf+spring+hibernate整合(一)

    jsf+spring+hibernate整合,于struts+spring+hibernate整合的过程非常相似(就不截图了,可以参考第一篇文章),但是前者相对于后者稍微麻烦一些. 第一步:初步整合, ...

  6. Spring、Struts2+Spring+Hibernate整合步骤

    所使用的Jar包: Hibernate: Spring(使用MyEclipse自动导入框架功能) Struts2: 注解包和MySql驱动包: 1.配置Hibernate和Spring: <be ...

  7. spring mvc+spring + hibernate 整合(二)

    在上篇文章中,我建立了工程并配置了spring + hibernate.今天我们检验下上篇文章的成果,如何检查呢?那就是进行单元测试.本篇文章就让大家和我一起来就前面的建的工程进行单元测试. 本项目使 ...

  8. JSF Spring Hibernate 整合:JSH1

    JSF1.1 + Spring2.0 + Hibernate3.1 项目图示: JSF1.1 Jar包: MyFaces1.1 Jar包: Spring与Hibernate包的配置与文章 web.xm ...

  9. struts+spring+hibernate整合小例子

    项目结构图 地址:http://www.blogjava.net/xiaoyi/articles/xiaoyi_ssh.html 包 com.yz.dao.impl package com.yz.da ...

最新文章

  1. WAF果真是个好东西
  2. 机器学习初学者公众号下载资源汇总(一)
  3. python中module的意思_python中module的意思
  4. java数组 —(8)
  5. nginx将ip+端口号映射为域名
  6. JQ基础练习---图片划过变暗
  7. Java依赖多个版本,java – Gradle中的多个依赖项版本
  8. 一dubbo框架学前原理介绍
  9. MySQL的jar包下载
  10. GIS技巧100例25-ArcGIS之shp文件修复
  11. phpstudy的安装及pikachu渗透平台的搭建
  12. 特教学校计算机课,北京特教学校引入编程课 计算机语言为听障孩子打开一扇智能之门...
  13. github上成员贡献量_精确统计github贡献者的代码行数
  14. 【11月18日截稿】【高校支持】第三届机器人、智能控制与人工智能国际学术会议-RICAI 2021...
  15. MATLAB导入LTspice RAW格式文件教程(绘制波特图)
  16. php array_diff_assoc,关于array_diff_assoc的详细介绍
  17. ac.find_template 踩坑,寻找相似图片,安卓自动化代码
  18. 量化交易接口怎么自动选股票?
  19. xiaopiu怎么导出html,xiaopiu原型工具
  20. jz2440——点亮led

热门文章

  1. 中国小伙CVPR 18论文遭质疑:同行难复现,要求评议组撤稿
  2. 特斯拉首个中国工厂落户上海临港
  3. Java Web中相对路径与绝对路径的分析
  4. Swoole(PHP高级Web开发框架)
  5. 特殊人物请遵循公司工作的基本准则
  6. Android 意图和意图过滤器(二)
  7. log file switch
  8. 关于.NET异步调用的初步总结
  9. 虚拟机全知道_12个使用技巧
  10. 用PHP实现浏览器点击下载各种格式文档的方法详解【txt apk等等】