2 Replies Latest reply on Feb 12, 2011 9:42 PM by rattysword

    Flex + Java + BlazeDS: Some instances already created on the server are unavailable from Flex!!!

    JoseAjáAjá Level 1

      Hi Everyone.

       

      Thank you for all the documentation, and the great forum.

       

      I have a question about the Java Factory; I've read somewhere that: "... the JavaFactory will check if there is already an instance in the scope and return that. If the object is not available then it is instantiated ...", but I don't understand the expression "if the object is not available"?

       

      I am having trouble to find and/or assign classes already instantiated (by another class) in the server, to a declared destination.

       

      Here is the scenario:
      I'm developing an application in Java:

      • J2EE.
      • I'm running it on a Tomcat 6 server
      • I'm using BlazeDS to communicate with Flex.
      • I'm using the RPC's Remoting Service (through RemoteObjects)

       

      There are two java classes that handle Client (Flex) interaction, say ApplicationClass and UserApplicationClass.

       

      • ApplicationClass has a reference (attribute) to a UserApplicationClass instance
      • ApplicationClass should be the one and only entry point (although BlazeDS requires an empty constructor) to instantiate a UserApplicationClass.
      • UserApplicationClass is instantiated, right after the attribute User has been set on ApplicationClass.

      //Java Code
           public class ApplicationClass {

              private User user = null;
               private UserApplicationClass userApplicationClass = null;
               ...
               public ApplicationClass {}
               ...
               public void setUser(User user) {
          
                  this.user = user;
                   this.userApplicationClass = new UserApplicationClass(user);
              }
               ...
          }

       

       

      Up to here everything is fine:

      From the Flex client I am able to use ApplicationClass methods, set its User and get the UserApplicationClass attribute from ApplicationClass.

       

       

      But here is the problem:

      When I try to use any method of UserApplicationClass from Flex (through a RemoteObject that connects with that class), It doesn't find the class already created on the server, but instead, it instantiates a brand new one (with all of its attributes set to null by using the default constructor).

       

      How could I assure that the destination points to a specified instance on the server, created by another class, and not instantiating a new one?

      // Flex Client Code
           <mx:Application

      ...
           creationComplete="invokeService()">
           ...
           <mx:Script>
      <![CDATA[
           import application.UserApplicationClass;
           ...
           private var userApplicationClass :UserApplicationClass;
           ...
           private function invokeService():void
           {
      applicationClassRemoteObject.getUser(); // Ok
           userApplicationClass.getUser(); // Ok
           userApplicationClassRemoteObject.getUser(); // Fails; user null;
           //the JavaFactory doesn't find the UserApplicationClass
           //instance on the server and creates a new instance.

           }
           ...
           private function applicationClass_getUser(event:ResultEvent):void
           {
      // Validate null ResultEvent ...
           userApplicationClass = UserApplicationClass(event.result);
          }
           ...
           ]]>

           </mx:Script>

       

      <mx:RemoteObject

      id="applicationClassRemoteObject"
           destination="ApplicationClassDestination"
           showBusyCursor="true">
           ...
         <mx:method
      name="getUserApplicationClass"
           result="applicationClass_getUser(event)"
           />

        </mx:RemoteObject>

       

      <mx:RemoteObject

      id="userApplicationClassRemoteObject"
           destination="UserApplicationClassDestination"
           showBusyCursor="true">
         <mx:method
      name="getUser"
           result="userApplicationClass_getUser(event)"
           />

           ...

         </mx:RemoteObject>
           ...

         </mx:Application>

       

      Note: scope attribute (on remoting-config.xml) on both destinations is set to session.

       

      I hope I have been clear; I would really appreciate if you could help me.


      Thanks in advance,