ConversationScopedは複数クラスごとに管理できない。

タイトルだけだと多分何言ってるかわかんないと思います。私も何言ってんのかよくわかんなかったです。
前提はJava EE 7(GlassFish 4.1)で使用しているJSFは2.2です。

事情

ClassAとClassBはともにConversationScopedで、ともにconversationをInjectしている。
とあるひと「ClassAとClassBはConversation別々に管理できるよね!」
つまり、下記のような感じです。

  • ClassAでConversation(以降長いので会話と表現)を開始してもClassBでは会話は始まっていない。
    ClassBで明示的に会話を開始する必要がある。
  • 逆に、ClassAで会話を終了してもClassBで始まっている会話は終了しない。

ぼく(そのかんがえはおかしいのでは…)

説得フェーズ

とあるひとに事情を説明するのにコードを書きました。
具体的な動作としては

  • ConversationScopedの牛(MowMowクラス)と猫(NyanNyanクラス)が存在。
  • JSFでそれぞれの会話開始ボタンをクリックすると、牛と猫の名前が変わる。
  • JSFでそれぞれの会話終了ボタンをクリックすると、さて、牛と猫の名前はどうなるでしょう。

とあるひとの主張が正しければ、牛の会話ボタンを先に押しても、後で猫の会話開始ボタンを押したときに猫クラスのconversation.isTransientはtrueのはず。
かつ、牛と猫で会話を始めて、先に牛の会話を終了させても猫の名前は変わったままのはず。

結果

牛の会話ボタンを押しても、後で猫の会話開始ボタンを押したときに
猫クラスのconversation.isTransientはfalse、かつ牛との会話を終わらせると猫の名前も一緒に元に戻りました。

実際に書いたコード

長くて貼れないのでGitHubに上げました。
retrorocket/conversation-example
SessionScopedも一緒に検証したので実際にはSessionScopedな犬(WanWanクラス)がいます。

捕捉

とあるひとの主張を実現できるような方法があるのか調べたのですが見つからなかったので、ないんじゃないかなぁと思いました。(小並感