`

Spring整合Hessian

阅读更多

转载自Spring整合Hessian

前言:

近日着手研究了一下Hessian的rmi方案,因为客户端是多种移动终端平台,本来想采用传说中的phprpc(hprose?)的,但看了下官方的文档,发现没有object-c的版本,故而放弃。

跟着hessian 的官方例子走,跑起来是没有问题的,但我在试着跟spring整合的时候,出了不少的问题。记录一下,方便自己以及路人,呵呵。

 

环境说明:

 

  • spring version 3.0 RELEASE.
  • Hessian version 4.0.7 WHATEVER.
  • JEE version 2.5

实现步骤:

  1. 配置 web.xml ,添加对spring-web中 DispatcherServlet的定义.具体如下:
    Xml代码收藏代码
    1. <servlet>
    2. <servlet-name>test-remote</servlet-name>
    3. <servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
    4. <init-param>
    5. <param-name>contextConfigLocation</param-name>
    6. <param-value>/WEB-INF/config/test-remote.xml</param-value>
    7. </init-param>
    8. <load-on-startup>4</load-on-startup>
    9. </servlet>
    10. <servlet-mapping>
    11. <servlet-name>test-remote</servlet-name>
    12. <url-pattern>/remote/*</url-pattern>
    13. </servlet-mapping>
    Tips:
    A. 很多网友都说一定要在WEB-INF下面放入跟servlet-name相对应的 test-remote-servlet.xml 配置文件,实际上是不一定要那么处理的。如果指定了 contextConfigLocation的话,就可以解决这个问题。意味着spring不会强制要求你配置文件的位置。
    B. DispatcherServlet是可以配置多个的,我这里还有一个test-local,mapping着 "/" 路径,他们之间并不会影响。当然可以单纯的配置多个 servlet-mapping.我只是想验证一下,结果说明确实是可以的。
  2. 传输对象类Space 的定义:
    Java代码收藏代码
    1. packagetest.remote.dto;
    2. importjava.io.Serializable;
    3. importjava.util.Date;
    4. /**
    5. *Spacedatatransferobject.
    6. *@authorgogo
    7. *
    8. */
    9. publicclassSpaceimplementsSerializable{
    10. /**
    11. *autogeneratedserialVersionUid.
    12. */
    13. privatestaticfinallongserialVersionUID=5632812127919571530L;
    14. /**publicspacenameforpeopleinthespace.*/
    15. privateStringpublicName;
    16. privateStringprivateName;
    17. privatebooleanisActive;
    18. privateDatelastUpdatedTime;
    19. /**
    20. *setter&getter
    21. */
    22. @Override
    23. publicStringtoString(){
    24. StringBuilderbuffer=newStringBuilder("Space:");
    25. buffer.append("publicname:").append(publicName).append(",");
    26. buffer.append("privatename:").append(privateName).append(",");
    27. buffer.append("isactived:").append(isActive).append(",");
    28. buffer.append("lastUpdatedTime:").append(lastUpdatedTime.getTime());
    29. returnbuffer.toString();
    30. }
    31. }
  3. 服务接口的定义如下:
    package test.remote.service;
    Java代码收藏代码
    1. importjava.util.List;
    2. importtest.remote.dto.Space;
    3. /**
    4. *
    5. *@authorgogo
    6. *
    7. */
    8. publicinterfaceSpaceService{
    9. ListshowSpaceNames();//返回名字集合
    10. SpacefindSpace(Stringid);//找到空间名字
    11. booleanupdateSpaceName(Stringname);//更新空间名字
    12. }
  4. 服务接口实现类:
    package test.remote.service.impl;
    Java代码收藏代码
    1. importjava.util.ArrayList;
    2. importjava.util.Date;
    3. importjava.util.List;
    4. importorg.apache.commons.logging.Log;
    5. importorg.apache.commons.logging.LogFactory;
    6. importorg.springframework.remoting.caucho.HessianServiceExporter;
    7. importtest.remote.dto.Space;
    8. importtest.remote.service.SpaceService;
    9. /**
    10. *这个是一个远程接口的测试实现<br>
    11. *该接口会由spring的{@linkHessianServiceExporter}以Http服务的形式暴露.<br>
    12. *客户端会依赖Hessian实现
    13. *@seeHessianServiceExporter
    14. *@authorgogo
    15. *
    16. */
    17. publicclassSpaceServiceImplimplementsSpaceService{
    18. privatestaticfinalLoglog=LogFactory.getLog(SpaceServiceImpl.class);
    19. privateSpacecreateSpace(){
    20. Spacespace=newSpace();
    21. space.setPublicName("roosher-space");
    22. space.setPrivateName("my-private-room");
    23. space.setActive(true);
    24. space.setLastUpdatedTime(newDate());
    25. returnspace;
    26. }
    27. publicSpacefindSpace(Stringid){
    28. //TODOAuto-generatedmethodstub
    29. log.debug("findspaceidis:"+id);
    30. returncreateSpace();
    31. }
    32. publicListshowSpaceNames(){
    33. //TODOAuto-generatedmethodstub
    34. Listnames=newArrayList<String>();
    35. for(inti=0;i<10;i++){
    36. names.add("Hellospace"+i);
    37. }
    38. returnnames;
    39. }
    40. publicbooleanupdateSpaceName(Stringname){
    41. //TODOAuto-generatedmethodstub
    42. log.debug("updatedspacename:"+name);
    43. returntrue;
    44. }
    45. }
  5. test-remote.xml的内容:
    Xml代码收藏代码
    1. <?xmlversion="1.0"encoding="UTF-8"?>
    2. <beansxmlns="http://www.springframework.org/schema/beans"
    3. xmlns:context="http://www.springframework.org/schema/context"
    4. xmlns:p="http://www.springframework.org/schema/p"
    5. xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    6. xsi:schemaLocation="http://www.springframework.org/schema/beans
    7. http://www.springframework.org/schema/beans/spring-beans-3.0.xsd
    8. http://www.springframework.org/schema/context
    9. http://www.springframework.org/schema/context/spring-context-3.0.xsd">
    10. <bean
    11. class="org.springframework.web.servlet.handler.BeanNameUrlHandlerMapping"
    12. p:order="1"></bean>
    13. <beanid="spaceService"class="test.service.impl.SpaceServiceImpl">
    14. </bean>
    15. <beanclass="org.springframework.web.servlet.mvc.HttpRequestHandlerAdapter">
    16. </bean>
    17. <beanname="/SpaceHessian"
    18. class="org.springframework.remoting.caucho.HessianServiceExporter"
    19. p:serviceInterface="test.remote.service.SpaceService"
    20. p:service-ref="spaceService">
    21. </bean>
    22. <beanname="/SpaceBurlap"
    23. class="org.springframework.remoting.caucho.BurlapServiceExporter"
    24. p:serviceInterface="test.remote.service.SpaceService"
    25. p:service-ref="spaceService">
    26. </bean>
    27. </beans>
    Tips:
    A. BeanNameUrlHandlerMapping 属性中的 p:order="1",可以不用配置.避免跟自己的冲突.
    B. HttpRequestHandlerAdapter 在这里面非常关键,没有它可能会出现这种错误:
    -- No adapter for handler Does your handler implement a supported interface like Controller ? HttpRequestHandlerAdapter它的作用就是让spring-mvc放出权限给下面的Exporter自己处理整个HTTP 流程.毕竟HessianServiceExporter也是实现的HttpRequestHandler
  6. 客户端的两种实现:
    A. 就是基于spring的实现,采用org.springframework.remoting.caucho.HessianProxyFactoryBean实现,相关配置如下:

    Java代码收藏代码
    1. <beanid="spaceServiceHessian"
    2. class="org.springframework.remoting.caucho.HessianProxyFactoryBean">
    3. <propertyname="serviceUrl"
    4. value="http://localhost:8080/test/remote/SpaceHessian"/>
    5. <propertyname="serviceInterface"value="test.remote.service.SpaceService"/>
    6. </bean>
    7. <beanid="spaceServiceBurlap"
    8. class="org.springframework.remoting.caucho.BurlapProxyFactoryBean">
    9. <propertyname="serviceUrl"
    10. value="http://localhost:8080/test/remote/SpaceBurlap"/>
    11. <propertyname="serviceInterface"value="test.remote.service.SpaceService"/>
    12. </bean>
    注意到里面的URL了没? 其中 http://localhost:8080/test/remote/SpaceHessian 的/SpaceHessian 对应的是之前在remote-test.xml中配置的<bean name="/SpaceHessian"> </bean>的URI.

    然后通过spring获取上下文之后,就可以直接注入 SpaceService service = context.getBean("spaceServiceBurlap");

    B . 就是基于Hessian 自己提供的客户端,这里展示的是Java版本.
     
  7. Java代码收藏代码
    1. packagetest.remote;
    2. importjava.net.MalformedURLException;
    3. importjava.util.List;
    4. importcom.caucho.hessian.client.HessianProxyFactory;
    5. importtest.remote.dto.Space;
    6. importtest.remote.service.SpaceService;
    7. /**
    8. *连接客户端。测试时要注意url的ip地址.
    9. *@seeSpace
    10. *@authorgogo
    11. *
    12. */
    13. publicclassSpaceClient{
    14. publicstaticvoidmain(String[]args){
    15. Stringurl="http://192.168.0.9:8080/test/remote/SpaceHessian";
    16. HessianProxyFactoryfactory=newHessianProxyFactory();
    17. try{
    18. SpaceServicespaceService=(SpaceService)factory.create(
    19. SpaceService.class,url);
    20. System.out.println(spaceService.findSpace("testid"));
    21. System.out.println(spaceService.updateSpaceName("whatever"));
    22. ListspaceNames=spaceService.showSpaceNames();
    23. System.out.println("\r\nGetspacenames:");
    24. for(inti=0;i<spaceNames.size();i++){
    25. System.out.print(spaceNames.get(i)+",");
    26. }
    27. System.out.println();
    28. System.out.println("spacenameslistfinished");
    29. }catch(MalformedURLExceptione){
    30. e.printStackTrace();
    31. }
    32. }
    33. }
    如果后台没有什么太大的问题,直接跑起来就可以测试了。
  8. 测试结果:
    Java代码收藏代码
    1. Space:publicname:roosher-space,privatename:my-private-room,isactived:true,
    2. lastUpdatedTime:1282196778538
    3. true
    4. Getspacenames:
    5. Hellospace0,Hellospace1,Hellospace2,Hellospace3,Hellospace4,Hellospace5
    6. ,Hellospace6,Hellospace7,Hellospace8,Hellospace9,
    7. spacenameslistfinished
分享到:
评论

相关推荐

    Spring集成Hessian案例

    Spring集成Hessian的过程主要包括以下几个步骤: 1. **定义服务接口**:首先,我们需要创建一个Java接口,包含服务提供者需要暴露给消费者的方法。例如,我们可以定义一个名为`UserService`的接口,包含用户查询、...

    spring 集成 hessian例子

    Hessian是一个轻量级的remoting onhttp工具,使用简单的方法提供了RMI的功能。 相比WebService,Hessian更简单、快捷。采用的是二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。参考文档地址...

    spring整合hessian进行远程通讯

    标题中的“spring整合hessian进行远程通讯”是指在Spring框架中使用Hessian库来实现远程过程调用(RPC)。这是一个常见的技术组合,用于构建分布式系统,使得应用组件之间可以跨网络进行高效通信。 Hessian是一种二...

    Spring整合Hessian访问远程服务

    首先,让我们理解Spring整合Hessian的基本原理。Spring通过其强大的IoC(Inversion of Control)容器管理服务和客户端,而Hessian则提供了一种二进制的序列化方式,使得远程服务调用更为高效。整合这两者,我们可以...

    spring集成Hessian插件配置改成自动注入。

    总之,Spring集成Hessian插件并改用自动注入可以极大简化服务的管理和调用。通过合理的配置和注解,我们可以实现服务的自动发现和依赖注入,提升代码的灵活性和可维护性。同时,理解并熟练掌握这一技术对于提升开发...

    Spring整合Hessian(Maven Web工程)

    一个Spring整合Hessian的Demo,同时包含Hessian服务端与客户端。是一个Maven工程,IDE使用的Eclipse,运行前需要安装Eclipse的Maven插件。可以结合文章一起学习,地址是...

    Spring中集成Hessian的问题

    在Spring框架中集成Hessian是为了实现远程方法调用(Remote Method Invocation, RMI),这是一种轻量级的序列化协议,可以高效地传输Java对象。Hessian使得服务提供者和服务消费者之间能够通过网络进行快速的数据...

    spring aop hessian 基础demo 部署即可运行

    - **简单易用**:Hessian提供了简单易用的API,便于开发和集成。 **Spring AOP与Hessian的结合** 在Spring中,Hessian通常用来实现远程服务调用。通过AOP,我们可以对Hessian服务进行拦截,添加如日志、性能监控等...

    Spring和Hessian的整合案例

    Hessian是一个由Caucho Technology开发的轻量级二进制RPC协议,因为采用的是二进制协议,所以它很适合于发送二进制数据。 本例子使用spring 整合hessian使开发更加的容易。

    spring+hessian+maven整合.zip

    在Spring整合中,我们可以使用HessianExporter来暴露服务,HessianProxyFactoryBean来创建服务客户端。 3. **Maven**:Maven的pom.xml文件定义了项目依赖、构建过程和插件设置。在这个项目中,它会管理Spring、...

    struts2+ibatis+spring+Hessian 整合项目

    struts2+ibatis+spring+Hessian 整合项目 web项目整合,服务端用hessian协议远程调用服务端的方法,hessian是用spring代理整合,struts2+ibatis+spring的整合项目,用作学习和开发基础平台构建很有用处,工程导入...

    基于spring+hessian框架的webservice实例

    本实例重点探讨的是基于Spring框架和Hessian协议的Web Service实现,这是一种轻量级、高效的远程调用解决方案。 首先,我们要理解Spring框架。Spring是Java领域的一个核心框架,它提供了全面的编程和配置模型,用于...

    Hessian的Spring配置

    在Spring框架中集成Hessian,我们需要进行以下步骤: 1. **创建服务接口和服务实现**: 首先,你需要定义一个服务接口,然后实现这个接口。例如,我们有一个`HelloHessianService`接口,包含一个`sayHello`方法。 `...

    hessian与spring整合的jar包

    当我们将Hessian与Spring进行整合时,主要目标是利用Spring的依赖注入(Dependency Injection, DI)和组件管理能力来简化Hessian服务的创建和管理。以下是一些关键知识点: 1. **Spring核心模块**(spring-core-...

    Spring配置hessian远程服务

    使用eclipse maven工程搭建hessian远程服务demo 分服务端的整合和客户端 建议阅读相关博客http://blog.csdn.net/heisemuyangquan/article/details/79460528

    spring、hessian通过tomcat的简单环境应用源代码

    【标题】"spring、hessian通过tomcat的简单环境应用源代码"涉及到的是在Java Web开发中使用Spring框架和Hessian服务序列化技术在Tomcat服务器上的集成与应用。Spring是一个广泛使用的开源Java应用程序框架,它提供了...

    Hessian与Spring整合需要jar包

    3. **Spring Web库**:如果Hessian服务是通过HTTP提供,那么还需要`spring-web.jar`,它提供了Web相关的支持,如Servlet API的集成。 4. **Servlet容器库**:如`servlet-api.jar`,如果你的应用运行在传统的Java EE...

    flex_spring_hessian框架(Java部分)

    在Java开发中,Flex-Spring-Hessian框架常常被用于构建富客户端应用,它整合了Adobe Flex前端与Spring后端服务,利用Hessian协议进行二进制RPC通信,提高了数据传输效率。本篇文章将围绕这三个关键组件,深入探讨...

Global site tag (gtag.js) - Google Analytics