Случайно натолкнулся на еще один FDS-альтернативный проект - Granite Data Services
На данный момент поддерживает AMF3 и удаленные вызовы через RemoteObject. Разработчики позиционируют его как альтернативу FDS для J2EE, с поддержкой EJB3 (хотя можно работать и с POJO-based destination) и Hibernate. Есть поддержка custom serialization, class mapping, что есть весьма хорошо.
Несмотря на акцент на J2EE , я смог за час прикрутить Granite к Tomcat (он идет под JBoss) и адаптировать SpringFactory для FDS от Jeff Vroom к Granite.
Исходники очень просты для понимания (ну может кроме AMF-сериализации), честно говоря не думал что все так просто :)
По-моему на Granite стоит обратить внимание, альтернатив не так уж и много вроде.. по крайней мере я этим точно займусь.
16 февр. 2007 г.
7 февр. 2007 г.
Область видимости FDS destination и Spring
У destination в FDS есть 3 области видимости - application, session, request. Для меня в начале изучения SpringFactory было странно, что автор в фабрике не предусмотрел эти варианты - при попытке выставить атрибут scope у destination, инстанцируемого через SpringFactory, Tomcat падал с ужасными криками.
Понимание пришло позже - ведь Spring сам управляет видимостью бинов и нет необходимости возлагать эту работу на fds или фабрику. То есть вместо использования атрибута scope у destination, мы выставляем видимость у бина в конфиге Springа. Только не забудьте перед этим в web.xml сконфигурировать Spring, чтобы он мог работать с web-based scopes:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Ну или если у вас другой Spring или сервлет-контейнер, то лучше глянуть в мануале Spring.
Понимание пришло позже - ведь Spring сам управляет видимостью бинов и нет необходимости возлагать эту работу на fds или фабрику. То есть вместо использования атрибута scope у destination, мы выставляем видимость у бина в конфиге Springа. Только не забудьте перед этим в web.xml сконфигурировать Spring, чтобы он мог работать с web-based scopes:
<listener>
<listener-class>org.springframework.web.context.request.RequestContextListener</listener-class>
</listener>
Ну или если у вас другой Spring или сервлет-контейнер, то лучше глянуть в мануале Spring.
Spring of Flex
Ну вот, собственно о сабже - как привязать наш java-backend, использующий Spring Framework, к FDS? А точнее, как сконфигурировать destination в FDS, чтобы Spring взял на себя всю работу по созданию классов, связанных с destination и обеспечил их конфигурирование?
FDS поддерживает концепцию фабрики, позволяющую нам осуществлять пользовательское инстанцирование компонент - то есть предоставить FDS уже готовый сконфигурированный компонент. Jeff Vroom создал такую фабрику для интеграции с Spring - SpringFactory, берущую на себя всю работу (скачать можно на Adobe Exchange).
Итак, за дело - на примере Tomcat5 / Spring2.
В web.xml прописываем путь к spring конфигу и сам spring listener - стандартные в общем-то действия,поэтому приводить их не буду. Конфиг-файл springа для FDS ничем FDS-специфичным не отличается - это ваши Spring beans.
Следующий шаг - указать FDS нашу SpringFactory в services-config.xml:
<factories>
<factory id="springFactory" class="path.to.SpringFactory" />
</factories>
Осталось указать destination, что он должен использовать SpringFactory - например в remoting-config.xml:
<destination id="my.destination">
<properties>
<factory>springFactory</factory>
<source>mySpringBean</source>
</properties>
</destination>
Ну и последний момент - осталось добавить определение mySpringBean в конфиг Springа:
<bean id="mySpringBean" class="myClass">
<property name="myProp" ref="itemManager" />
</bean>
Все - теперь при обращении к destination, FDS запросит у фабрики экземпляр mySpringBean, которая возьмет его у Spring.
Более подробную информацию можно найти у Christophe Coenraets - Using Flex with Spring.
Также Кристоф выложил Flex Test Drive Server, включающий примеры интеграции Spring (и не только).
FDS поддерживает концепцию фабрики, позволяющую нам осуществлять пользовательское инстанцирование компонент - то есть предоставить FDS уже готовый сконфигурированный компонент. Jeff Vroom создал такую фабрику для интеграции с Spring - SpringFactory, берущую на себя всю работу (скачать можно на Adobe Exchange).
Итак, за дело - на примере Tomcat5 / Spring2.
В web.xml прописываем путь к spring конфигу и сам spring listener - стандартные в общем-то действия,поэтому приводить их не буду. Конфиг-файл springа для FDS ничем FDS-специфичным не отличается - это ваши Spring beans.
Следующий шаг - указать FDS нашу SpringFactory в services-config.xml:
<factories>
<factory id="springFactory" class="path.to.SpringFactory" />
</factories>
Осталось указать destination, что он должен использовать SpringFactory - например в remoting-config.xml:
<destination id="my.destination">
<properties>
<factory>springFactory</factory>
<source>mySpringBean</source>
</properties>
</destination>
Ну и последний момент - осталось добавить определение mySpringBean в конфиг Springа:
<bean id="mySpringBean" class="myClass">
<property name="myProp" ref="itemManager" />
</bean>
Все - теперь при обращении к destination, FDS запросит у фабрики экземпляр mySpringBean, которая возьмет его у Spring.
Более подробную информацию можно найти у Christophe Coenraets - Using Flex with Spring.
Также Кристоф выложил Flex Test Drive Server, включающий примеры интеграции Spring (и не только).
6 февр. 2007 г.
Enum и FDS
Для начала - проблемка первая, о которой я спрашивал в ruflex (к сожалению - без ответа).
Есть java enum:
Он идет как атрибут некоего класса, замапленного на flex-класс.
Java:
Flex:
Вопрос: как отразить этот атрибут во flex? Прямое соответствие невозможно, насколько я понимаю, - в AS3 нет enum. Пробуем Object: после вызова java-метода, возвращающего экземпляр Item, в дебагере видим:
availability - mx.data.ManagedObjectProxy, в который завернут Object - абсолютно пустой, без единого атрибута.
Пока нашел только такое решение - написание своей собственной сериализации/десериализации для класса Item. В Java коде, при сериализации преобразуем enum в строковое значение и наоборот при десериализации.
Подробнее - в livedocs, Using custom serialization .
Есть java enum:
public enum ItemAvailability {
PUBLIC_ITEM, RESTRICTED_ITEM
}
Он идет как атрибут некоего класса, замапленного на flex-класс.
Java:
public class Item {
private String name;
private ItemAvailability availability = ItemAvailability.RESTRICTED_ITEM;
}
Flex:
[RemoteClass(alias="com.package.Item")]
public class Item {
public var name:String;
public var availability:Object;
}
Вопрос: как отразить этот атрибут во flex? Прямое соответствие невозможно, насколько я понимаю, - в AS3 нет enum. Пробуем Object: после вызова java-метода, возвращающего экземпляр Item, в дебагере видим:
availability - mx.data.ManagedObjectProxy, в который завернут Object - абсолютно пустой, без единого атрибута.
Пока нашел только такое решение - написание своей собственной сериализации/десериализации для класса Item. В Java коде, при сериализации преобразуем enum в строковое значение и наоборот при десериализации.
Подробнее - в livedocs, Using custom serialization .
О чем это я?
А все о том же - о "кухне" за красивым и кульным flex приложением. Некоторое время назад пришлось уйти от модели php -> xml -> flex в пользу более сложного java backend -> FDS -> flex. Об этом совсем не жалею, но новые технологии всегда приносят и новые проблемы: во многих знаниях многие печали.
Я не гуру ни в Java, ни в Spring и Hibernate, поэтому здесь буду публиковать результаты моей борьбы с Flex-закулисьем.
Надеюсь, кому-то грабли, на которые я наступил, помогут в будущем :)
Я не гуру ни в Java, ни в Spring и Hibernate, поэтому здесь буду публиковать результаты моей борьбы с Flex-закулисьем.
Надеюсь, кому-то грабли, на которые я наступил, помогут в будущем :)
Подписаться на:
Сообщения (Atom)