Разработка
Очень часто бывает, что при использовании Hibernate, на серверной стороне Java, для исключения избыточности данных, часть полей помечаются как ленивые (lazy="true"). И в этом случае, когда данные сериализуются для передачи данных во Flex-уровень возникает LazyInitializationException. Очень желательно оградить такие поля от сериализации, так же бывает необходимо по различным причинам исключить часть полей из сериализации из Java-уровня во Flex.
Для корректной работы надо произвести следующие шаги:
- Скачать библиотеку BlazeDS Annotations Jar and Source Files. И положить в classpath.
- Зарегистрировать AnnotatedBeanProxy. Для этого в инициализационный сервлете необходимо необходимо добавить строку PropertyProxyRegistry.getRegistry().register(IAnnotatedProxy.class, new AnnotatedBeanProxy()); (В моём случае, у меня нет какого-то одного класса, который вызывался бы при старте, я добавил эту строку в сервис, который обрабатывает запросы из Flex)
- Для объекта или сервиса, которые надо ограничить, необходимо проделать следующие шаги:
- Реализовать интерфейс IAnnotatedProxy. Данный интерфейс говорит BlazeDS, что этот класс имеет аннатацию и должен использовать AnnotatedBeanProxy вместо стандартногоBeanProxy
- Добавить аннотацию для класса: @FlexClass(classType = FlexClass.FlexClassType.RemoteObject) (для объекта); @FlexClass(classType = FlexClass.FlexClassType.RemoteService) (для сервиса)
- Добавить аннатацию для get методов. Данная библиотека аннотаций предоставляет два вида поведения:
Аннотации которые управляют включением поля в BlazeDS AMF сериализацию.
- @FlexField(fieldType = FlexFieldType.ReadWrite) - Значение по умолчанию. Действует так же, как BlazeDS сейчас.
- @FlexField(fieldType = FlexFieldType.Excluded) - Исключает данное поле из сериализации данных. Использование данной аннотации может быть обусловлено различными причинами, но в качестве основных причин можно указать следующие: 1) увеличение скорости 2) обеспечение безопасности 3) ограничить передачу избыточных данных. Данные возвращаемые из Flex в Java будут иметь значение null.
- @FlexField(fieldType = FlexFieldType.Transient) - Включает это поле в синхронизацию из Java во Flex, если для этого поля есть get-метод и не требует наличие set-метода. Данный вариант возможен, если ваше поле является вычисляемым и его нужно отобразить конечному пользователю через Flex. Аннотации, которые управляют данными во время сериализации. Примечание: чтобы использовать эти аннатации, объекты на обоих сторонах (Java и Flex) ОБЯЗАНЫ расширять mx.rpc.remoting.JavaObject. Перед использованием этих аннотаций вы болжны быть точно уверены, что правильно понимаете, что они делают.
- @FlexField(fieldType = FlexFieldType.ReadOnly) - это поле включается в сериализацию как со стороны Java и Flex. Однако, когда данные приходят из Flex-уровня на Java-уровень. Однако, когда данные приходят из Flex обратно в Java, данное поле не меняется. Пример: значение 999 для поля "номер счёта" передаётся из Java во Flex. Данное значение помечается, как "ключ" Java-объекта. Теперь пользователь хочет сохранить информацию, и данные посылаются обратно из Flex в Java. Если значение отлично от 999, будет сгенерировано (runtime) ReadOnlyEception. Как правило такое поведение может быть использоано для обеспечения целостности данных. Я хочу предоставить пользователю возможность просматривать данные, но не менять их на Flex-уровне.
- @FlexField(fieldType = FlexFieldType.CreateOnly) - это поле включается в сериализацию как со стороны Java и Flex. Поведение данного поля почти такое же как и для полей с аннотацией ReadOnly. Отличие заключается в том, что, если у поля нет значения, когда поле передаётся из Java во Flex, может быть создано на стороне Flex и передано обратно для сохранения.
Написано по мотивам http://www.flexpasta.com/index.php/2008/05/19/blazeds-with-annotations-for-remote-objects/