2016-04-21 4 views
0

Я создаю приложение Vaadin и, основываясь на демонстрационном приложении QuickTickets и других примерах, решил использовать для обработки событий Guava EventBus, поэтому я сохраняю ссылаясь на него на уровне экземпляра UI., связанный с несериализуемым Guava EventBus в Ваадине с сериализацией сеанса

Поскольку я также использую Spring Ботинки с Devtools, который может перезагрузить приложение без необходимости холодного запуска, я обнаружил, что гуавы-х EventBus не Serializable, что приводит к java.io.NotSerializableException.

Как этого можно избежать?

Например:

  1. Есть ли способ сделать Serializable обертки вокруг EventBus? Ему нужно будет сохранить список зарегистрированных прослушивателей событий и перерегистрировать их на EventBus во время перезагрузки сессии (и, я думаю, для этого нужна ссылка transient на EventBus, чтобы она не сериализовалась).
  2. Поскольку я все же использую Spring, возможно, я смогу сделать EventBus UI-областью Bean? Думаю, мне все-таки нужно обработать перерегистрацию слушателей, тогда каким-то образом.

ответ

0

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

Я написал небольшую библиотеку, jdal-aop, чтобы разрешить прямое использование любого весеннего боба на пользовательских интерфейсах vaadin с использованием сериализуемых прокси.

Возможно, вы хотите попробовать.

+0

мне нужно делать использовать AspectJ, если я использую эту библиотеку? Кроме того, как именно происходит перерегистрация абонентов EventBus? – herman

+0

@herman Нет, вам не нужен AspectJ, это библиотека весны. Пожалуйста, разместите фактическую декларацию бобов в вопросе. Есть несколько способов сделать это. –

0

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

Если вы не хотите сохранять постоянную сессию (что является ключом к приложению без гражданства, которое должно быть легко реплицировано), поместите server.session.persistent=false в ваш файл application.properties.

1

Попытка заставить vaadin работать в общей среде сеанса Мне также пришлось столкнуться с этой проблемой. Вместе с замечательной аннотацией SerializableProxy от Jose и исправлением библиотеки интеграции весны vaadin (также благодаря другой реализации xpoft), похоже, можно запустить ее.

Вы можете найти пример приложения здесь: https://github.com/khauser/microservices4vaadin в пределах внешнего интерфейса microservice

Там вы найдете также скорректированный EventBus от quickticket приборной панели, которая может быть autowired/впрыскивается как:

@Autowired 
@SerializableProxy 
private MyEventBus myEventBus; 
Смежные вопросы