Показаны сообщения с ярлыком blazeds. Показать все сообщения
Показаны сообщения с ярлыком blazeds. Показать все сообщения

суббота, 6 марта 2010 г.

Сериализация полей без set-методов и поддержка аннотаций в BlazeDS

Для передачи данных между BlazeDS 3.2 и клиентом рекомендуется использовать value object-ы. Эти объекты содержат только те данные, которые действительно необходимы клиенту.

К сожалению, в BlazeDS есть некоторые неудобства при сериализации объектов:

  • Обязательное наличие set-метода (можно и пустого), если вы хотите сериализовать поле у которого есть только get-метод

  • Сериализация enum-ов как объектов, вместо использования строчного значения, как заявлено в документации

Так же не очень удобно, на мой взгляд, является создание отдельных классов для каждого value object-a. Было бы удобнее помечать аннтоциями getter-ы или поля, которые будут учавствовать/отсутсвовать в value object-е, без создания нового класса.

Чтобы устранить вышеперечисленные недостатки придется разобраться с механизмом сериализации BlazeDS. Кратко опишу классы, которые задействованы при сериализации: flex.messaging.io.PropertyProxy - основной интерфейс, используемый для сериализации/десериализации объектов. Каждому классу объекта, передаваемому на клиента, соответствует определенная реализация PropertyProxy, в основном это flex.messaging.io.BeanProxy. Соответствие (Класс объекта - PropertyProxy-объект) держится в классе flex.messaging.io.PropertyProxyRegistry, при сериализации/десериализации BlazeDS получает PropertyProxy для какого-либо объекта используя методы: getProxy и getProxyAndRegister.

Т.к. PropertyProxyRegistry является singleton-ом, то замену реализации нам придется сделать через смену значения поля registry, которое спрятано внутри класса. Реализация, в которой убраны перечисленные выше недостатки, выглядит так:

пятница, 24 октября 2008 г.

Logout в Spring Security используя BlazeDS

В продолжение темы программной аутентификации, решил описать программный способ logout-а в BlazeDS. Я знаю, что кому-то это может очень пригодиться .-) Необоходимо сделать logout на уровне бизнес-логики, которая о javax.servlet.http.HttpSession ничего не знает и знать не может. Покопавшись в исходниках flex.messaging.FlexSession
и его подклассе flex.messaging.HttpFlexSession я нашел замечательный метод invalidate. Опять же, код в три строчки:

public void logout() {
HttpFlexSession flexSession = (HttpFlexSession) FlexContext.getFlexSession();
flexSession.invalidate(false);
SecurityContextHolder.clearContext();
}