Warning: file_get_contents(/data/phpspider/zhask/data//catemap/9/java/379.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/regex/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Java 用会话序列化处理Vaadin中不可序列化的Guava事件总线_Java_Session_Serialization_Vaadin_Guava - Fatal编程技术网

Java 用会话序列化处理Vaadin中不可序列化的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周围创建一个可序列化的包装器?它需要保留一个已注册事

我正在创建一个Vaadin应用程序,基于QuickTickets演示应用程序和其他示例,我决定使用Guava的
EventBus
进行事件处理,因此我在
UI
实例级别保留对它的引用

由于我还在使用Spring Boot和DevTools,它可以在不需要冷启动的情况下重新加载应用程序,我发现Guava的
EventBus
不可
序列化
,导致
java.io.NotSerializableException

如何避免这种情况

例如:

  • 有没有办法在
    EventBus
    周围创建一个可序列化的
    包装器?它需要保留一个已注册事件侦听器的列表,并在会话重新加载时将它们重新注册到
    EventBus
    (我猜它需要
    EventBus
    的瞬态
    引用,这样它就不会被序列化)
  • 既然我使用的是Spring,也许我可以将
    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声明。有几种方法可以做到这一点。