`
suk
  • 浏览: 8501 次
  • 性别: Icon_minigender_1
  • 来自: 南京
社区版块
存档分类
最新评论

Spring和Flex之间通信的关键

    博客分类:
  • Flex
阅读更多
近期由于需要做一个实时仪表盘的动态图表,于是开始研究Flex技术。
匆忙下载了FlexBuiler4,BlazeDS 3.2(用于和Java通讯),本机的Java开发环境为myeclipse6.0.1,eclipse 3.3。
在未使用Spring架构测试过程中一切都很顺利,Flex很容易就发现Web程序/WEB-INF/flex/remoting-config.xml中定义的服务。
	<destination id="dataService">
		<properties>
			<source>sample.service.DataService</source>
		</properties>
	</destination>

sample.service.DataService为我写好的数据提供服务类。

当我在引入Spring注解标签注册Bean取得DAO对象时的就出现了问题。在Flex中测试服务时提示找不到服务的错误。想了下可能是由于Flex在和Java通讯时取得的服务实例并不是通过Spring注册的Bean的实例。

如何获取上下文中定义的bean呢?
ApplicationContext中有个getBean(String beanName)方法,可以通过Bean的名字取得对应Bean的实例。准备着手写的时候,我在网上发现了Jeff Vroom这位达人实现的FlexFactory接口的一个类。

SpringFactory.java
package flex.samples.factories;

import org.springframework.context.ApplicationContext;
import org.springframework.web.context.support.WebApplicationContextUtils;
import org.springframework.beans.BeansException;
import org.springframework.beans.factory.NoSuchBeanDefinitionException;

import flex.messaging.FactoryInstance;
import flex.messaging.FlexFactory;
import flex.messaging.config.ConfigMap;
import flex.messaging.services.ServiceException;


public class SpringFactory implements FlexFactory
{
    private static final String SOURCE = "source";

    public void initialize(String id, ConfigMap configMap) {}
    /**
     *  创建Flex引用的实例
     **/
    public FactoryInstance createFactoryInstance(String id, ConfigMap properties)
    {
        SpringFactoryInstance instance = new SpringFactoryInstance(this, id, properties);
        instance.setSource(properties.getPropertyAsString(SOURCE, instance.getId()));
        return instance;
    } // end method createFactoryInstance()


    public Object lookup(FactoryInstance inst)
    {
        SpringFactoryInstance factoryInstance = (SpringFactoryInstance) inst;
        return factoryInstance.lookup();
    } 


    static class SpringFactoryInstance extends FactoryInstance
    {
        SpringFactoryInstance(SpringFactory factory, String id, ConfigMap properties)
        {
            super(factory, id, properties);
        }


        public String toString()
        {
            return "SpringFactory instance for id=" + getId() + " source=" + getSource() + " scope=" + getScope();
        }
       /**
        *  通过Bean Id查找上下文取得对应Bean的实例
          */
        public Object lookup() 
        {
            ApplicationContext appContext = WebApplicationContextUtils.getWebApplicationContext(flex.messaging.FlexContext.getServletConfig().getServletContext());
            String beanName = getSource();

            try
            {
                return appContext.getBean(beanName);
            }
            catch (NoSuchBeanDefinitionException nexc)
            {
                ServiceException e = new ServiceException();
                String msg = "Spring service named '" + beanName + "' does not exist.";
                e.setMessage(msg);
                e.setRootCause(nexc);
                e.setDetails(msg);
                e.setCode("Server.Processing");
                throw e;
            }
            catch (BeansException bexc)
            {
                ServiceException e = new ServiceException();
                String msg = "Unable to create Spring service named '" + beanName + "' ";
                e.setMessage(msg);
                e.setRootCause(bexc);
                e.setDetails(msg);
                e.setCode("Server.Processing");
                throw e;
            } 
        }
        
    } 
} 



导入程序后,在WEB-INF/flex/services-config.xml文件中追加如下内容:
<factories>
     <factory id="spring" class="flex.samples.factories.SpringFactory" />
</factories>


然后再sample.service.DataService中添加@Service注释标签,如果应用中没有启用注解功能直接在spring配置文件applicationContext.xml中新增dataService的注册信息:
  <beans>
    <bean name="dataService" class="sample.service.DataService" singleton="true"/>
  </beans>


最后,修改下/WEB-INF/flex/remoting-config.xml文件中dataService的注册信息:

  <destination id="dataService">
      <properties>
          <factory>spring</factory>
          <source>dataService</source>
      </properties>
  </destination>


Flex 4中我尝试了下导入,几次都不成功。看来只能手工写了,取得服务的代码如下:
<mx:RemoteObject id="dataService" destination="dataService"/>


其中destination="dataService"为/WEB-INF/flex/remoting-config.xml中定义的dataService,不要搞错了哦。

调用服务的方法:
	<mx:Script>
		<![CDATA[
			protected function clickMe(event:MouseEvent):void
			{
				dataService.getRequest(dataRequest.text);
				dataService.addEventListener(ResultEvent.RESULT,getResult);
			}
			protected function getResult(event:ResultEvent):void
			{
				var s:String= event.result as String;
				trace(s);
			}
		]]>
	</mx:Script>
<mx:TextInput id="dataRequest"/>
<mx:Button label="Request" click="clickMe(event)" />


重新发布应用程序,OK!

总结:当使用Spring作为Web应用管理容器时,在系统启动的时候就会通过setter方法自动注入Bean的实例信息。我们在程序中动态创建实例时并没有被注入实例信息,需要手动注入实例信息。
分享到:
评论

相关推荐

    spring-flex-1.0.1.RELEASE

    2. 设计良好的服务层接口,以便在 Flex 客户端和 Spring 服务端之间进行有效通信。 3. 利用 Spring 的事务管理和安全控制,确保应用程序的稳定性和安全性。 总结,Spring Flex 1.0.1.RELEASE 是一个强大的工具,它...

    Spring 整合 Flex 包

    Spring Flex 提供了以下关键组件和特性: 1. **Spring-BlazeDS-Integration**: 这是 Spring 和 Adobe BlazeDS 之间的桥梁。BlazeDS 是一个免费的服务器端组件,它允许 Flex 客户端与 Spring 应用程序中的 Java 对象...

    spring-flex集成-demo

    3. **Spring-BlazeDS Integration**:在Spring Flex项目中,通常会使用BlazeDS作为中间件,它是一个免费的数据和消息传递服务器,允许Flex客户端与Spring应用服务器进行通信。BlazeDS提供了Remoting和 Messaging服务...

    spring整合flex所需jar包

    通过以上步骤,开发者可以在Spring后端和Flex前端之间建立无缝的通信,创建出功能强大且用户体验良好的RIA应用。在实际开发中,还需要考虑安全性、性能优化以及错误处理等多方面因素,确保整个系统的稳定性和可维护...

    用spring和Flex整合的一个例子

    BlazeDS是一个免费的服务器端组件,它提供了AMF(Action Message Format)协议,允许Flex客户端与Spring服务端之间进行低延迟、高效的二进制数据通信。 首先,让我们深入了解一下Spring与Flex整合的关键步骤: 1. ...

    整合spring+flex的web项目

    8. **优化性能**:通过缓存、异步请求、合理设计数据传输结构等方式优化Spring和Flex之间的通信,提高用户体验。 综上所述,整合Spring和Flex能构建出既具备强大后端服务又拥有出色用户体验的Web应用。通过灵活运用...

    spring整合Flex

    LCDS**: Spring与Flex之间的通信通常通过BlazeDS或LiveCycle Data Services (LCDS)实现,它们是Adobe提供的服务器端组件,支持AMF(Action Message Format)协议,使得数据能高效地在Flex客户端和Spring服务之间传输...

    spring-flex-1.5.0.M2-dist.zip

    在Spring Flex 1.5.0.M2中,核心组件`spring-flex-1.5.0.M2.jar`扮演了关键角色,它是Spring和Flex集成的核心库,提供了诸如消息代理、配置支持和Spring服务代理等功能。这个库使得Flex客户端可以轻松地调用Spring...

    SpringFlex框架搭建

    SpringFlex是Spring与Adobe Flex之间的桥梁,它通过AMF(Action Message Format)协议实现了服务器和客户端之间的高效数据传输。SpringFlex主要由两个关键组件构成:Spring BlazeDS Integration和SpringSource Tool ...

    Spring Flex 整合

    在Spring Flex项目中,主要目标是简化Spring和Flex之间的通信,提供一个无缝的集成环境,使开发人员能够利用Spring的强大功能来处理业务逻辑和服务,同时利用Flex的交互性和图形界面设计。这使得应用程序可以利用...

    flex+spring flex整合

    整合Flex和Spring的关键在于让Flex客户端能够方便地访问Spring管理的Bean,而BlazeDS和Spring BlazeDS Integration就是为了实现这一目标。BlazeDS是Adobe的开源项目,它提供了一个中间层,使得基于Flex的前端能够...

    FlexSpring jar包

    FlexSpring JAR包通常包含了实现Flex和Spring之间通信所需的类和库。这些类允许Flex客户端通过AMF(Action Message Format)或其他数据交换格式与Spring服务进行通信。AMF是一种高效的数据序列化格式,特别适合于...

    spring-flex

    Spring Flex 提供了若干关键组件,如 `flex-messaging-spring` 模块,它包含 Spring AMF Channel,用于配置和管理 AMF 通道,使得 Flex 客户端可以通过 HTTP 或 HTTPS 与 Spring 应用程序通信。此外,`spring ...

    Flex4 spring整合实例

    在本实例中,我们使用的spring-flex-1.0.3.RELEASE-with-dependencies包包含了所有必要的库和组件,以实现Flex客户端与Spring服务端之间的数据交换。这个包包括了Spring BlazeDS Integration库,它提供了一个基于...

    flex整合spring需要的spring相关包

    在整合Flex和Spring时,关键在于如何使Flex客户端能够与Spring服务端进行通信。以下是一些核心知识点: 1. **AMF通信协议**:Adobe Message Format (AMF) 是Flex与服务器之间进行数据交换的高效二进制格式。Spring ...

    Spring-Flex架构分析

    FlexServlet则是Spring与Flex之间通信的桥梁,它处理Flex AMF(Action Message Format)请求,将这些请求转发到Spring的业务逻辑层。 最后,`flex-servlet.xml`是Spring的上下文配置文件,专门针对Flex应用。在这里...

    Flex 与 Spring整合

    BlazeDS是Adobe提供的一个开源项目,它提供了AMF支持,使得Flex与Spring之间的通信更为顺畅。 4. **Spring-BlazeDS Integration**:Spring提供了对BlazeDS的官方支持,通过`spring BlazeDS integration library`,...

    flex+spring 工程

    4. **库文件**:描述中提到的"必备的lib"可能包含Flex SDK的库,Spring BlazeDS库(用于Flex和Spring之间的通信),以及其他第三方库,如 Parsley 或 Mate(用于依赖注入和事件驱动架构在Flex中的实现)。...

    Flex-Spring-JAVA-BLAZEDS.rar_Flex spring_flex_flex java

    标题中的“Flex-Spring-JAVA-BLAZEDS.rar”提到了三个关键技术:Flex、Spring和BlazeDS,这在IT行业中是关于前端与后端交互的重要技术组合。Flex是Adobe开发的一种用于创建富互联网应用(RIA)的开源框架,主要用于...

    spring-flex-reference

    ### Spring与Flex集成知识点 #### 一、Spring BlazeDS Integration 概览 **背景:** Spring框架自设计之初就致力于保持技术中立...希望本篇总结能够帮助读者更好地理解和掌握Spring与Flex集成的关键技术和实践要点。

Global site tag (gtag.js) - Google Analytics