我现在正在Java EE 7 tutorial了解CDI范围,并在最后一段中找到它说
使用会话,应用程序或会话范围的Bean必须是可序列化的,但使用请求范围的bean不必是可序列化的。
但令我困惑的是,在我的IDE(Netbeans和IntelliJ Idea)中,当我使用@SessionScoped或@ConversationScoped时,如果我没有像Java EE 7那样实现Serializable,它会给我一个错误教程说,显然,我无法构建项目然后运行它。当我使用@ApplicationScoped但没有实现Serializable时,事情变得奇怪,没有错误出现,我可以构建然后正常运行应用程序。
所以我对此非常好奇并且真的想知道原因。你能解释一下那里发生了什么吗?非常感谢你!
答案 0 :(得分:1)
IDE中的错误基本上是因为你的IDE有一些插件(不可信任100%btw)。
序列化的原因如下:
@SessionScoped
bean
@ConversationScoped
bean
@ApplicationScoped
bean
Serializable
存在答案 1 :(得分:1)
Serializable标记是bean的必需属性之一,它具有钝化能力(能够从活动状态转换为某种第二非活动状态)。如果bean具有钝化作用域(具有属性passivating=true
的作用域),则bean必须具有钝化功能。根据CDI规范1.1。只有Session
和Conversation
范围是钝化范围。
第6.6.4章钝化范围 例如,内置的会话和会话范围定义在 第6.7节是钝化范围。 没有其他内置范围 钝化范围。
因此,您的会话bean需要具有钝化能力 - 需要是Serializable,但您的应用程序范围bean不需要。此外,某些CDI容器在部署期间不会在会话作用域bean上丢失Serializable
上的错误,而只是在它们实际需要将bean实例从活动状态转移到被动状态时(例如,实例限制已经过命中,内存使用等)
有关详细信息,请阅读CDI 1.1 spec 快乐的黑客