Expand my Community achievements bar.

Flex Data Services and Java Objects

Avatar

Former Community Member
We are trying to decide if we want to go with Adobe Flex,
Flex Data Services and ColdFusion. We are mostly interested in Flex
Data Services push capabilities. We need to be very nimble and have
the ability to make rapid website changes. Currently, I am
evaluating these tools but often run into difficulty getting simple
things to work. I am having trouble learning to use Java objects
with Flex Data Services. I have run through a range of problems
from failing to connect to an rtmp channel to failing to
instansiate a Java object. It seems like everything thing I try
leads to new problems.



I am trying to run Flex Data Services on Tomcat (if that
makes a difference), jdk 1.5.0_09 and trying to get a very simple
mxml script to talk to very simple Java objects.





The mxml is simple:



<?xml version="1.0" encoding="utf-8"?>

<mx:Application xmlns:mx="
http://www.adobe.com/2006/mxml">



<mx:ArrayCollection id="myData2"/>

<mx:DataService id="RRA" destination="RRA"/>



<mx:DataGrid

dataProvider="{ myData2 }"

<mx:columns>

<mx:DataGridColumn

headerText="Name"

dataField="name"

width="60" />

</mx:columns>

</mx:DataGrid>

<mx:Button label="go" click="RRA.fill(myData2)"
/>



</mx:Application>





The flex-enterprise services.xml file:



<?xml version="1.0" encoding="UTF-8"?>

<services-config>

<services>

<service-include
file-path="flex-remoting-service.xml" />

<service-include file-path="flex-proxy-service.xml"
/>

<service-include file-path="flex-message-service.xml"
/>

<service-include file-path="flex-data-service.xml"
/>

</services>

<security>

<login-command
class="flex.messaging.security.JRunLoginCommand"
server="JRun"/>

<security-constraint id="basic-read-access">

<auth-method>Basic</auth-method>

<roles>

<role>guests</role>

<role>accountants</role>

<role>employees</role>

<role>managers</role>

</roles>

</security-constraint>

</security>

<channels>

<channel-definition id="my-amf"
class="mx.messaging.channels.AMFChannel">

<endpoint uri="
http://{server.name}:{server.port}/{context.root}/messagebroker/amf"
class="flex.messaging.endpoints.AMFEndpoint"/>

<properties>


<polling-enabled>false</polling-enabled>

</properties>

</channel-definition>



<channel-definition id="my-rtmp"
class="mx.messaging.channels.RTMPChannel">

<endpoint uri="rtmp://{server.name}:2038"
class="flex.messaging.endpoints.RTMPEndpoint"/>

<properties>


<idle-timeout-minutes>20</idle-timeout-minutes>


<client-to-server-maxbps>100K</client-to-server-maxbps>


<server-to-client-maxbps>100K</server-to-client-maxbps>

</properties>

</channel-definition>



<logging>

<target class="flex.messaging.log.ConsoleTarget"
level="Error">

<properties>

<prefix>[Flex] </prefix>

<includeDate>false</includeDate>

<includeTime>false</includeTime>


<includeLevel>false</includeLevel>


<includeCategory>false</includeCategory>

</properties>

<filters>

<pattern>Endpoint.*</pattern>

<pattern>Service.*</pattern>

<pattern>Configuration</pattern>

</filters>

</target>

</logging>



<system>

</system>



</services-config>





flex-remoting-service.xml:



<?xml version="1.0" encoding="UTF-8"?>

<service id="remoting-service"

class="flex.messaging.services.RemotingService"


messageTypes="flex.messaging.messages.RemotingMessage">



<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 adapter="java-object" id="RO">

<properties>


<source>blah.myPackage.ATestClass</source>

<scope>session</scope>

</properties>

</destination>

</service>





flex-data-service.xml:



<?xml version="1.0" encoding="UTF-8"?>

<service id="data-service"

class="flex.data.DataService"

messageTypes="flex.data.messages.DataMessage">



<adapters>

<adapter-definition id="actionscript"
class="flex.data.adapters.ASObjectAdapter" default="true"/>

<adapter-definition id="java-dao"
class="flex.data.adapters.JavaAdapter"/>

</adapters>





<default-channels>

<channel ref="my-amf"/>

</default-channels>



<destination id="RRA">

<adapter ref="java-dao" />

<properties>


<source>blah.myPackage.RRA</source>

<metadata>

<identity property="name"/>

</metadata>

<network>


<session-timeout>20</session-timeout>

<paging enabled="false" pageSize="10" />

<throttle-inbound policy="ERROR"
max-frequency="500"/>

<throttle-outbound policy="REPLACE"
max-frequency="500"/>

</network>

</properties>

</destination>

</service>





The destination id="RO" in flex-remoting-service.xml works OK
using <mx:RemoteObject> tag.







When trying to access the RRA object I initially had connect
failed errors when I used a channel definition that was something
like <endpoint uri="rtmp://{server.name}:{server.port}"
class="flex.messaging.endpoints.RTMPEndpoint"/> I switched
it to <endpoint uri="rtmp://{server.name}:2038"
class="flex.messaging.endpoints.RTMPEndpoint"/> and got the
runtime error (nothing in log files on startup):



[RPC Fault faultString="Unable to create a new instance of
type 'blah.myPackage.RRA'." faultCode="Server.ResourceUnavailable"
faultDetail="Types must have a public, no arguments constructor."]

at ...





I added a public default no arguments constructor to the
RRA.java file, reompiled and now I just get a runtime error that
looks like:



[RPC Fault faultString="Unable to create a new instance of
type 'blah.myPackage.RRA'." faultCode="Server.ResourceUnavailable"
faultDetail="null"]

at ...



From this configuration can anyone see why I am having
problems and how to get this simple example working? Also, is
developing for Flex Data Services typically a cumbersome task? At
this point I'm thinking that either I am missing something
fundamental or Flex Data Services is not the solution we are
looking for. What am I missing?



Thanks for any help!
2 Replies

Avatar

Former Community Member
It's very hard to read the configuration files you posted so
I can't tell if there's a problem there. It looks like a simple
problem though. Did you compile blah.myPackage.RRA? It might help
if you post blah.myPackage.RRA as well.

Avatar

Former Community Member
Thanks for the reply. Yes, I did compile all the Java and it
works OK with a simple Java program. It just will not work in a
Flex application.



The java classes are:



RRA:



package blah.myPackage;



import java.util.List;

import java.util.Collection;



import flex.data.DataSyncException;

import flex.data.assemblers.AbstractAssembler;



class RRA extends AbstractAssembler

{

public Collection fill( List fillParameters )

{

RRS service = new RRS();

return service.getSome();

}

}



RRS:



package blah.myPackage;



import java.util.ArrayList;

import java.util.List;

import java.sql.*;



import flex.EORS.*;



class RRS

{

public List getSome()

{

ArrayList list = new ArrayList();

String str = "bob";

RR rr = new RR(str);

list.add(rr);

return list;

}

}



RR:



package blah.myPackage;



class RR

{

private String name;

public RR() { }

public RR(String name)

{

this.name = name;

}



public String getName()

{

return this.name;

}



public void setName(String name)

{

this.name = name;

}

}



I started with something that retrieved data from a database
but watered it down just to try and get some kind of communication
between Flex and Java.