org.jboss.weld.exceptions.IllegalStateException:WELD-000227:检测到Bean标识符索引不一致- 分布式容器可能不适用于相同的应用程序
当可序列化的类的Weld / CDI代理实例反序列化后(例如,在Tomcat重新启动后)发生不兼容的更改时,将引发此异常。在开发过程中,您很可能在未触及的情况下就编辑了可序列化会话或查看范围托管的beanserialVersionUID
。或者,您已经添加/更新/删除了与CDI相关的库。如果您在Eclipse中使用Tomcat,请在Eclipse的@H_301_7@Servers 视图中右键单击Tomcat服务器条目,然后选择 @H_301_7@Clean Tomcat Work Directory 。这将清除序列化的会话,从而解决此异常。
每当您在可序列化的类中进行不兼容的更改(例如添加新的实例字段)时,都需要重新生成该serialVersionUID
值(以防您正在IDE生成该值),或将其值加1(以防万一)您使用的是默认设置1L
)。
因此,这不一定是Weld中的错误,但在我看来,它应该已经丢弃了不兼容的代理实例,创建了一个新的实例并打印了警告消息,而不是将此异常完全阻止了该请求。
如果您实际上正忙于开发并且每次都遇到此异常,请考虑关闭服务器中的会话持久性。如何执行此操作取决于所使用的服务器。对于Tomcat 7,请参阅The Manager Component文档中的 “ Disable Session Persistence ” 部分。
特定消息 @H_301_7@“分布式容器可能无法与相同的应用程序一起使用” 顺便说一句,指的是当您在具有会话共享(例如云)的群集环境中运行Web应用程序时的可能情况,其中至少有一个服务器具有不同版本的Web应用程序。这种情况将在生产中导致此异常。