2016-04-21 66 views
0

我創建了Vaadin應用程序,並基於QuickTickets演示應用程序和其他示例,我決定使用Guava的EventBus進行事件處理,所以我保留在UI實例級別參考它。在Vaadin處理不可序列化的Guava EventBus與會話序列化

由於我也使用Spring引導與DevTools,這可以在不需要冷啓動加載的應用程序,我發現番石榴的EventBusSerializable,導致java.io.NotSerializableException

這怎麼可以避免?

例如:

  1. 有沒有一種方法,使周圍EventBus一個Serializable包裝?它需要保留一個已註冊的事件偵聽器列表,並在會話重新加載時重新註冊到EventBus(我想它需要transientEventBus的引用,所以它不會被序列化)。
  2. 因爲我使用的是彈簧,也許我可以使EventBus的用戶界面範圍爲Bean?我想我仍然需要以某種方式處理聽衆重新註冊。

回答

0

這是使用spring和vaadin時的常見問題,因爲大多數spring單例不是可序列化的(或者根本不應該序列化)。

我寫了一個小型庫jdal-aop,允許使用可序列化代理直接在vaadin UI上注入任何spring bean。

也許你想嘗試一下。

+0

我需要如果我使用該庫,使用AspectJ?另外,如何重新註冊'EventBus'用戶呢? – herman

+0

@herman不,你不需要AspectJ,它是一個春天的aop庫。請在問題中發佈實際的bean聲明。有幾種方法可以做到這一點。 –

0

您不應該序列化EventBus,因爲它將包含應該使用新UI重新創建的UI組件實例。如果你想避免異常,你可以簡單地創建一個包裝類Serializable類,如上所述,使該類的會話作用域,並將EventBus放在該類中,標記爲瞬態。

如果您根本不需要會話持久性(這是無狀態應用程序的關鍵,應該輕鬆進行復制),請將server.session.persistent=false添加到application.properties文件中。

1

試圖讓vaadin在共享會話環境中運行我也不得不面對這個問題。再加上Jose的偉大的SerializableProxy註解和vaadin的spring集成庫的修復(也得益於xpoft的另一個實現),似乎可以讓它運行。

您可以在這裏找到一個示例應用程序:https://github.com/khauser/microservices4vaadin前端微服務

在那裏,你還可以找到來自quickticket儀表板的調整EventBus,它可以自動裝配/內注射,如:

@Autowired 
@SerializableProxy 
private MyEventBus myEventBus; 
相關問題