Flex + Java + BlazeDS: некоторые экземпляры классов Java, уже созданные на сервере, недоступны в Flex! - PullRequest
0 голосов
/ 10 февраля 2011

Спасибо за всю документацию и отличный форум.

У меня есть вопрос по поводу Java Factory; Я где-то читал, что: «... JavaFactory проверит, существует ли уже экземпляр в области видимости, и вернет его. Если объект недоступен, то он создается ...», но я не понимаю выражение "если объект недоступен"?

У меня проблемы с поиском и / или назначением классов, уже созданных (другим классом) на сервере, объявленному месту назначения.

Вот сценарий :

Я занимаюсь разработкой приложения на Java:

  • J2EE.
  • Я запускаю его на Tomcat 6 Сервер
  • Я использую BlazeDS для общения с Flex.
  • Я использую удаленное управление RPC Сервис (через RemoteObjects)

Существует два Java-класса , которые обрабатывают взаимодействие с клиентом (Flex), скажем ApplicationClass и UserApplicationClass :

  • ApplicationClass имеет ссылку (атрибут) для UserApplicationClass Экземпляр
  • ApplicationClass должен быть единственная точка входа (хотя BlazeDS требует пустой конструктор), чтобы создать экземпляр ** Пользователь * ApplicationClass *;

UserApplicationClass создается сразу после того, как атрибут User установлен в 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);
        }
        ...
    }

До этого все нормально:

Из клиента Flex я могу использовать методы ApplicationClass, установить его User и получить атрибут UserApplicationClass из ApplicationClass .

Но здесь проблема :

Когда я пытаюсь использовать любой метод UserApplicationClass , Он не находит класс, уже созданный на сервере , но вместо этого создает экземпляр нового класса (все его атрибуты установлены в нуль с помощью конструктора по умолчанию).

Как я могу убедиться, что место назначения указывает на указанный экземпляр на сервере, созданный другим классом, а не создающий экземпляр нового?

**// 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="***ApplicationClass***Destination"
            showBusyCursor="true">
            ...
            <mx:method 
                name="getUserApplicationClass"
                result="applicationClass_getUser(event)"
            />      
        </mx:RemoteObject>

        <mx:RemoteObject 
            id="userApplicationClassRemoteObject" 
            destination="***UserApplicationClass***Destination"
            showBusyCursor="true">
            <mx:method 
                name="getUser"
                result="userApplicationClass_getUser(event)"
            />
            ...
        </mx:RemoteObject>
        ...
    </mx:Application>

Примечание. Атрибут области (в remoting-config.xml) в обоих местах назначения установлен в сеанс.

Надеюсь, я был ясен; Буду очень признателен, если вы мне поможете.

Заранее спасибо,

AM

Ответы [ 2 ]

1 голос
/ 29 декабря 2011

JoseVelas, Даже я столкнулся с той же проблемой, что и ты. После краткого поиска в Google я выяснил проблему с файлом удаленной конфигурации. Если вы попытаетесь дать следующий код в java Factory

<destination id=”my-destination”>

<properties>

<source>flex.samples.EmployeeService </source>

**<scope>application</scope>**

</properties>

</destination>

У меня отлично работает. Прицел играет здесь важную роль, надеюсь, он может вам помочь.

0 голосов
/ 10 февраля 2011

Вам следует искать внедрение Staful Service в BlazeDS.Ищите доступные области для услуг.например, вы можете иметь этот ApplicationClass одинаковым для всех пользователей или иметь один для каждого пользователя.

По умолчанию он не имеет состояния, поскольку для каждого запроса создается новый объект.Если конфигурация назначения содержит флаг с отслеживанием состояния, в сеансе HTTP выполняется поиск существующего экземпляра объекта, поэтому для компонента с сохранением состояния будет вызываться несколько запросов от одного и того же клиента.от Класс JavaAdapter

Я надеюсь, что эти ссылки дадут вам направление: http://flexuniverse.wordpress.com/2010/05/20/setting-up-gilead-for-blazeds-in-statefull-mode/ http://sujitreddyg.wordpress.com/2009/01/20/how-remoting-service-in-blazeds-works/

...