Java 用会话序列化处理Vaadin中不可序列化的Guava事件总线
我正在创建一个Vaadin应用程序,基于QuickTickets演示应用程序和其他示例,我决定使用Guava的Java 用会话序列化处理Vaadin中不可序列化的Guava事件总线,java,session,serialization,vaadin,guava,Java,Session,Serialization,Vaadin,Guava,我正在创建一个Vaadin应用程序,基于QuickTickets演示应用程序和其他示例,我决定使用Guava的EventBus进行事件处理,因此我在UI实例级别保留对它的引用 由于我还在使用Spring Boot和DevTools,它可以在不需要冷启动的情况下重新加载应用程序,我发现Guava的EventBus不可序列化,导致java.io.NotSerializableException 如何避免这种情况 例如: 有没有办法在EventBus周围创建一个可序列化的包装器?它需要保留一个已注册事
EventBus
进行事件处理,因此我在UI
实例级别保留对它的引用
由于我还在使用Spring Boot和DevTools,它可以在不需要冷启动的情况下重新加载应用程序,我发现Guava的EventBus
不可序列化
,导致java.io.NotSerializableException
如何避免这种情况
例如:
EventBus
周围创建一个可序列化的包装器?它需要保留一个已注册事件侦听器的列表,并在会话重新加载时将它们重新注册到EventBus
(我猜它需要对EventBus
的瞬态引用,这样它就不会被序列化)
EventBus
作为一个UI作用域Bean
?我想我仍然需要以某种方式处理听众的重新注册在使用spring和vaadin时,这是一个常见问题,因为大多数spring单例都不是可序列化的(或者根本不应该序列化) 我编写了一个小库,允许使用可序列化代理在VaadinUIS上直接注入任何Springbean
也许您想试试。您不应该序列化EventBus,因为它将包含应使用新UI重新创建的UI组件实例。如果您想避免异常,您可以简单地创建一个包装器
可序列化
类,将该类会话设置为作用域,并将EventBus放在该类中,标记为transient
如果您根本不想要会话持久性(这是无状态应用程序的关键,应该很容易复制),请将
server.session.persistent=false
放在application.properties
文件中。要让vaadin在共享会话环境中运行,我也不得不面对这个问题。再加上Jose伟大的SerializableProxy注释和vaadin的spring集成库修复(也要感谢xpoft的另一个实现),它似乎可以运行
您可以在这里找到一个示例应用程序:在前端微服务中
在这里,您还可以从quickticket仪表板找到一个经过调整的EventBus,它可以自动连接/注入,如:
@Autowired
@SerializableProxy
private MyEventBus myEventBus;
如果使用该库,是否需要使用AspectJ?另外,
EventBus
订阅者的重新注册是如何发生的?@herman不,你不需要AspectJ,它是一个springaop库。请在问题中发布实际的bean声明。有几种方法可以做到这一点。