Как BlazeDS генерирует файлы - PullRequest
0 голосов
/ 09 февраля 2012

Я предоставляю приложение для работы, которое использует приложение Java EE для бэкэнда, Flash для внешнего интерфейса и BlazeDS для их соединения. Я никогда не использовал Flash или BlazeDS и пытаюсь понять, как работает BlazeDS.

Пока я понимаю, что при подключении к BlazeDS во FlashBuilder файл remoting-config.xml сканируется, чтобы определить, какие службы существуют на стороне Java. FlashBuilder спросит, какие из этих сервисов вы хотите импортировать, и какие «пакет услуг» и «пакет типов данных» вы хотите использовать.

Когда вы выбираете Java ExampleService, BlazeDS создаст _Super_ExampleService.as и ExampleService.as и поместит их в ваше местоположение "пакета услуг". ExampleService.as пусто, но расширяет _Super_ExampleService.as (в основном это Flash-сервис, который вы можете использовать для вызова методов в вашем Java-сервисе). Если вам нужно добавить дополнительные методы, вы бы добавили их в ExampleService.as. (Надеюсь, это все правильно, пожалуйста, поправьте меня, если я ошибаюсь)

Моя проблема в том, что я не могу понять, что BlazeDS делает для объектов-значений.

Когда вы выбираете ExampleService во FlashBuilder (предположим, что это сервис для сущности Example), какие объекты-значения создает BlazeDS? Я ожидал бы Example.as и _SuperExample.as. Тем не менее, _ExampleEntityMetadata.as также появляется.

Мои вопросы в основном:

  1. Как BlazeDS определяет, какие объекты ценности создавать? Сканирует ли она БД, сканирует ли проект аннотации @Entity, сканирует ли какой-либо файл конфигурации, сканирует ли сервис, чтобы определить, с какими объектами он работает и т. Д.
  2. Какую цель выполняет каждый из 3 классов? Это похоже на ту же настройку со службой (при необходимости измените не-_ Super), но теперь есть третий файл.
  3. Я заметил, что объекты-значения не всегда соответствуют непосредственно объектам Java (имеют дополнительные свойства, отсутствующие свойства и т. Д.). Почему это?
  4. Как объекты-ценности используются вместе со службами?

У меня также были общие вопросы:

  1. Когда вы подключаетесь к сервису во FlashBuilder, что вы на самом деле делаете? В первый раз я представляю, как BlazeDS делает необходимые сервисы и оценивает объекты. Но что, если они уже там (скажем, вы уже подключились или вы отключили код и подключились впервые)? Делает ли подключение только доступность служб в вашей копии FlashBuilder?
  2. Гарантируется ли, что BlazeDS всегда будет генерировать сервисы и объекты стоимости одинаково? Как строка для строки?

Ответы [ 2 ]

3 голосов
/ 09 февраля 2012

Здесь мало путаницы. Blaze делает следующее:

  1. Реализует формат AMF (это собственный формат Flash для сериализации объектов Flash). Так что он знает, как писать и читать объекты Flash.

  2. Реализует некоторые расширенные функциональные возможности, необходимые для среды Flex (что на самом деле плохо, потому что она плохо написана и вам никогда не нужна, но это отдельная история). Например, он предоставляет ряд классов для имитации своих аналогов Flex в Java, а на стороне Flex он имитирует карты, деревья и т. Д. (Никогда даже не пытайтесь использовать это).

  3. Создает специальный обработчик (и), который будет загружаться вашим веб-сервером (Tomcat, JBoss и т. Д.) И обрабатывать входящее соединение из Flash. Этот обработчик создается для каждой сессии - что бы это ни значило в вашем контексте. Этот обработчик также известен как FlexHandler (так обычно выглядит в файлах конфигурации).

Чего не делает Blaze:

  1. Он не генерирует исходные файлы (источники ценностных объектов не генерируются - вы должны сделать это самостоятельно). Однако у него есть некоторые часто используемые типы - все числовые типы, строки, логические значения, некоторые коллекции и т. Д.

  2. Не влияет на существующий код и не интегрируется в Flash Builder. Программа, которая делает это, называется Fiber, она предоставляется Adobe (тот же источник), но это совершенно другая вещь, это проприетарный продукт, она преследует другие цели (она может генерировать код для языков, отличных от Java, например).

Fiber - это в основном экспериментальный продукт, он был представлен в Flash Builder 4 (то есть около года назад), и в настоящее время он чрезвычайно сырой. В основном это полезно только в качестве иллюстрации или подтверждения концепции, но оно не было проверено в полевых условиях (и трудно найти добровольцев:)

remoting-config.xml не является каким-либо особым именем, однако, в силу примера, из которого скопировано много лотов, имя распознается как часть services-config.xml (опять же, имя , не имеет особого значения и может быть изменено, однако обычно оно называется этим именем). Эти файлы имеют двойное назначение. Когда приложение Flex скомпилировано, эти файлы могут использоваться компилятором Flex для создания некоторых настроек по умолчанию для RemoteObject (вы, вероятно, не хотите делать это таким образом, если вы действительно не уверены в том, что делаете, но даже тогда Вы, вероятно, не хотели бы делать это таким образом ...). С другой стороны, эти параметры используются FlexHandler (упомянутым выше), чтобы узнать, куда следует ожидать подключения клиента Flash. Последнее является особенно трудной темой, потому что невозможно отладить код Blaze в здравом уме, и очень трудно понять, что именно является базовым URL и т. Д. К счастью для вас, вы можете заменить эту абракадабру: <endpoint url="http://{server.name}:{server.port}/{context.root}/messagebroker/amf" на что-то более осознанное как <endpoint url="http://server-name/gateway" (то есть нет необходимости искать значения server.name и server.port - действительно очень трудно найти, где они прячутся.

Классы, сгенерированные Fiber (EntityMetadata, _SuperXxx и т. Д.), В конечном итоге вредны. Это попытка отразить на Java-коде и привить некоторую похожую логику в код AS3. Увы, люди, которые написали это, не имели ни малейшего представления о том, как работает AS3 - так что там происходит чистое безумие.

Существуют определенные правила при переводе объекта значения Java во Flash:

  1. На любой стороне вы можете добавить дополнительные свойства, которые не существуют на другой стороне. Blaze не будет заполнять их (очевидно), но свойства будут существовать и будут доступны. Недостаток - вы получите кучу рутнимских ошибок (подавленных) с обеих сторон. Чтобы избежать этого, на стороне AS3 вы можете пометить нежелательное свойство как [Transient]. Но подумайте дважды, прежде чем сделать это - это признак плохого дизайна. В идеале вам это не нужно. Я не знаю, что такое Java-аналог Transient.

  2. Вы не можете иметь свойство с тем же именем, но с другим типом - ошибки такого рода не подавляются.

  3. Традиционно для Java свойства логического типа называются isSomething - для Blaze вам придется сделать исключение или назвать их (get|set)IsSomething, если вы настаиваете ...

Объекты значений создаются Blaze на стороне Java, когда он вызывает функции Java, предназначенные для обработки сервисов. Они, очевидно, появляются в качестве аргументов для обработчиков. Объекты значений создаются на стороне Flash самим проигрывателем Flash - это создает определенные проблемы, такие как - нет способа передать перечислители - он все равно попытается вызвать конструктор класса AS3. Не допускаются аргументы конструктора не по умолчанию.

Когда вы подключаетесь к сервису во Flash Builder - не делайте этого. Никто на самом деле не знает, что именно вы делаете. Код является частной собственностью, и никаких обещаний о замораживании функций и т. Д. Сделано не было. На сегодняшний день для того, кто может программировать, не используя щелчок мыши, на самом деле гораздо проще на самом деле написать программный код, чем делать это пошаговым способом мастера.

Blaze генерирует только объекты-значения во время выполнения - вы можете быть почти уверены в этом. Это предсказуемо, и если произойдут серьезные изменения, вы обязательно будете уведомлены :) Blaze не генерирует исходный код.

0 голосов
/ 13 февраля 2012

В итоге я просто купил книгу Kindle на Amazon и прочитал некоторые главы (в частности, главу 26).Вот в основном то, что я узнал:

  • С течением времени продукты Adobe развивались и разделялись, пока не была создана «LifeCycle Data Services» (LCDS).Эта технология работает на сервере и предоставляет различные функции.
  • Adobe выпустила "BlazeDS" в качестве бесплатной версии LCDS (с меньшим количеством функций).
  • Функцией, которую я использую BlazeDS, является«Служба удаленного взаимодействия» (есть также «Служба сообщений» и «Служба прокси»).Служба удаленного взаимодействия позволяет вызывать методы службы Java из внешнего интерфейса Flash.Данные передаются между Flash и Java через двоичный формат, называемый «Формат сообщения действия» (AMF).
  • РЕЗЮМЕ BlazeDS находится на сервере и позволяет Flash и Java взаимодействовать через AMF.

Чтобы иметь возможность вызывать методы Java во Flash, сделайте следующее (примечание: я принял именование по умолчанию):

  • Создайте обычный Java POJO (некоторыеограничения: нужен конструктор по умолчанию, методы должны быть общедоступными, чтобы быть доступными и т. д.).
  • В remoting-config.xml добавьте пункт назначения для службы.Вы заметите, что есть канал под названием my-amf.Если вы посмотрите на services-config.xml, вы увидите соответствующее определение канала, которое использует AMF и указывает на ваше работающее приложение (с помощью динамических выражений).
  • При настройке проекта Flash Builder вы указываете местоположениевашего веб-приложения, чтобы он знал, куда он должен отправлять запросы.
  • ОБЩАЯ ИНФОРМАЦИЯ Вы разрешаете связь Java, создавая службу Java, настроив ее в remoting-config.xml и сообщив проекту Flash о своем местоположении в веб-приложении (чтобы он мог знать, где найти объекты Java)).

На этом этапе вы можете вызывать свои службы вручную в MXML или ActionScript, как показано ниже (предположим, что в Java ExampleService отображается как exampleService в remoting-config.xml).

//MXML
<s:RemoteObject id="myExampleService" destination="exampleService" />
<s:Button label="Call a Method" click="myExampleService.myMethod()" />

//ActionScript
var myExampleService:RemoteObject = new RemoteObject("exampleService");
myExampelService.myMethod();

* Примечание. Можно многое узнать о вышеизложенном (и подобных вещах), например об обработке результатов и т. Д. Но я не буду вдаваться в подробности.

Теперь, чтобыподключиться для передачи данных между Flash и Java, он становится сериализованным.Преобразование типов Flash в типы Java не является идеальным.Например, Flash Array превращается в Java List / Map.И Java List / Map превращается во Flash ArrayCollection / Object.Из-за этого вы можете использовать шаблон проектирования «объект стоимости».По сути, вы создаете объект Flash, который отражает объект Java, с которым работают ваши службы.Так что если бы у вас был Example класс Java, вы могли бы создать ExampleVO класс Flash.Вам необходимо пометить класс Flash с помощью [RemoveClass(alias="my.package.Example")] и т. Д.

Однако, чтобы упростить жизнь, вы можете автоматически создавать эти файлы.BlazeDS связывается с Flash Builder по протоколу «Служба удаленной разработки» (RDS).В вашем файле web.xml вы можете включить RDSDispatchServlet.После включения RDS можно подключаться к данным в Flash Builder («Данные»> «Подключиться к BlazeDS»).

И, как ответ на вопрос, в книге говорится:

By default, if a Java class's public method returns an instance of a strongly typed value object class, the connection wizard creates a matching ActionScript value object class. The conversion of the server-side data to ActionScript value object happens at runtime and is managed by the generated code.

...