2017-05-30 106 views
1

我現在正在學習有關CDI範圍在Java EE 7 tutorial和尋找,在最後一段,它說@ApplicationScoped必須是可序列化的?

豆類使用會話,應用程序,或對話範圍必須是可序列化,但使用請求範圍不必豆可序列化。

但是什麼困惑我很多東西是在我的IDE(Netbeans和IntelliJ IDEA的),當我使用@SessionScoped或@ConversationScoped,它確實給我,如果我不實現Serializable的錯誤,就像什麼Java EE 7教程已經說過,顯然,我不能構建項目然後運行它。當我使用@ApplicationScoped但沒有實現Serializable時,事情會變得很奇怪,沒有錯誤出現,我可以構建然後正常運行應用程序。

所以我很好奇,真的想知道爲什麼。你能解釋一下發生了什麼嗎?非常感謝!

回答

1

IDE中的錯誤顯示基本上是因爲您的IDE有一些插件(這不是100%btw可信)。是

系列化的原因如下:

  • @SessionScoped

    • 這些由多隻CDI規範處理和其他規範對他們
    • 也就是說,容器可要求選擇存儲鈍化會話以保存資源
    • 另一個故事是服務器之間的複製,所以y我們的要求可以在幾個節點上(轉移方案等)
    • 我們不知道爲什麼被處理,但正因爲如此,我們必須確保這種豆總是序列化
  • @ConversationScoped

    • 差不多相同的故事,並不是說其他​​規格會對他們有要求,但這些bean在會話範圍內「活」,並且可以在會話期間生活(如果不盡快結束)
    • For由於這些原因,當服務器鈍化/與會話一起復制會話範圍的Bean,它當然有鈍化/複製對話範圍豆類以及
  • @ApplicationScoped

    • 這些真的應該是可序列化的,但在某些情況下,即使它們不是
    • 這些情況下,您可以避免序列化,例如
    • 只要你需要這樣的bean複製到多個節點一個節點應用服務器上運行,你需要它是序列化過
    • 時可以省略串行化的另一種情況是在SE
    • 你的IDE因此智能和沒有強制要求Serializable存在
1

串行化標記爲豆所需的屬性中的一個,是鈍化能(能從活動狀態轉變爲某種第二非活動狀態)。如果bean具有鈍化範圍(屬性爲passivating=true),則該bean必須具有鈍化功能。根據CDI規範1.1。只有SessionConversation範圍是鈍化範圍。

章6.6.4鈍化作用域 例如,內置會議談話 6.7節定義作用域鈍化範圍。 鈍化示波器沒有其他內置示波器。

因此,您的會話bean需要具有鈍化功能--ergo需要可序列化,但您的Application範圍的bean不需要。此外,某些CDI容器在部署期間不會在會話作用域beans上丟失錯誤Serializable,但僅在實際需要將bean實例從活動狀態轉移到被動狀態時(例如實例限制已被命中,內存使用情況,等)

欲瞭解更多信息,請閱讀CDI 1.1 spec
開心黑客

相關問題