环境:

  • Spring blazeDS Integration 1.0.0 release
  • blazeDS 3.2.0.3978
  • jdk1.6.0_06
  • flex sdk 3.2.0
  • flex builder 3

在web.xml中配置DispatcherServlet

<?xml version="1.0" encoding="UTF-8"?>
<web-app xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
    xmlns
="http://java.sun.com/xml/ns/javaee" xmlns:web="http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    xsi:schemaLocation
="http://java.sun.com/xml/ns/javaee http://java.sun.com/xml/ns/javaee/web-app_2_5.xsd"
    id
="WebApp_ID" version="2.5">
    
<display-name>flex_server</display-name>
    
<context-param>
        
<param-name>contextConfigLocation</param-name>
        
<param-value>/WEB-INF/context-*.xml</param-value>
    
</context-param>
    
<listener>
        
<listener-class>org.springframework.web.context.ContextLoaderListener</listener-class>
    
</listener>
    
<servlet>
        
<servlet-name>flex</servlet-name>
        
<servlet-class>org.springframework.web.servlet.DispatcherServlet</servlet-class>
        
<load-on-startup>1</load-on-startup>
    
</servlet>
    
<servlet-mapping>
        
<servlet-name>flex</servlet-name>
        
<url-pattern>/messagebroker/*</url-pattern>
    
</servlet-mapping>
    
<welcome-file-list>
        
<welcome-file>index.html</welcome-file>
    
</welcome-file-list>
</web-app>


在flex-servlet.xml中定义destination

<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://www.springframework.org/schema/beans"
    xmlns:xsi
="http://www.w3.org/2001/XMLSchema-instance" xmlns:context="http://www.springframework.org/schema/context"
    xmlns:tx
="http://www.springframework.org/schema/tx" xmlns:flex="http://www.springframework.org/schema/flex"
    xsi:schemaLocation
="http://www.springframework.org/schema/beans 
    http://www.springframework.org/schema/beans/spring-beans-2.5.xsd
    http://www.springframework.org/schema/context
    http://www.springframework.org/schema/context/spring-context-2.5.xsd
    http://www.springframework.org/schema/tx
    http://www.springframework.org/schema/tx/spring-tx-2.5.xsd
    http://www.springframework.org/schema/flex   
    http://www.springframework.org/schema/flex/spring-flex-1.0.xsd"
>
    
<flex:message-broker />
    <!-- premiumService是普通的业务bean -->
    
<flex:remoting-destination ref="premiumService"/>
</beans>


这样在remoting-config.xml中就不需要定义destination了

<?xml version="1.0" encoding="UTF-8"?>
<service id="remoting-service" 
    class
="flex.messaging.services.RemotingService">

    
<adapters>
        
<adapter-definition id="java-object" class="flex.messaging.services.remoting.adapters.JavaAdapter" default="true"/>
    
</adapters>

    
<default-channels>
        
<channel ref="my-amf"/>
    
</default-channels>
    
<!--注释掉,否则启动会报错或出现其他问题
    <destination id="premiumService">
        <properties>
            <source>org.hag.flex.service.PremiumService</source>
        </properties>
    </destination>
    
-->
</service>


测试

<?xml version="1.0" encoding="utf-8"?>
<mx:Application xmlns:mx="http://www.adobe.com/2006/mxml"
    creationComplete
="premiumService.getPremiumList()">
    
<mx:Script>
        
<![CDATA[
            <!-- 省略import -->
            private function resultHandler(evt:ResultHandler):void
            {
                Alert.show(evt.result.toString());
            }
            private function faultHandler(evt:FaultHandler):void
            {
                Alert.show(evt.fault.toString());
            }
        
]]>
    
</mx:Script>
    
<mx:RemoteObject id="premiumService" ref="premiumService"
        result
="resultHandler(event)" fault="faultHandler(event)"/>
</mx:Application>


结果这时候报错,destination "premiumService" either does not exists....
原因是mxml编译时要根据remoting-config.xml来处理destination的定义,而我们把premiumService定义在了spring bean中,所以它根本就不知道premiumService的存在。取消掉remoting-config.xml的注释,再次对mxml进行编译(如修改后保存),在浏览器中清除缓存、刷新,OK,结果出来了。

注意在tomcat启动时又要把remoting-config.xml定义的destination注释掉,否则会出问题(那是由于blazeds找到两个相同的destination)。或者干脆在其他地方建立一个文件专门用于mxml的编译。