34154


同一セッション内で同じインスタンスを使い回すことを目的として、`@SessionScoped`をクラスに付ける場合、`@Stateful`を付ける必要はありますか？

[このページ](http://otndnld.oracle.co.jp/document/products/wlw/docs103/guide/ejb/session/conGettingStartedWithSessionBeans.html)に

> **注意** ：新しい EJB を作成する場合、デフォルトではステートレス Bean が作成されます。

と書かれているので、気になりました。  
セッション単位でステートを保持したいので、ステートレスとして扱われては問題があります。  
（そもそもCDIの`@SessionScoped`を付けたクラスは、EJBなのでしょうか？）


CC BY-SA 3.0
2017-04-18T01:43:25.787
34084
2017-04-20T06:57:57.660
8078
question
java java-ee
@SessionScopedなクラスに@Statefulを付ける必要があるか？


いくつか認識が誤っている可能性があると感じましたので、まずそれらについて述べます。

1.  
CDI組み込みスコープである`@SessionScoped`が言うところのセッションとは、(サーブレットコンテが管理する) **HTTPセッション**
です[[cdi-spec]](http://docs.jboss.org/cdi/spec/1.2/cdi-
spec.html#session_context)。  
他方、Stateful Session Beanが言うところのセッションとは、(EJBコンテナが管理する) **EJBセッション**
であり、それぞれ全く関係がないものです。

2.

> > **注意** ：新しい EJB を作成する場合、デフォルトではステートレス Bean が作成されます。
>
> と書かれているので、気になりました。

参照されているページは Oracle
Workshopというプロダクトのページであり、この記述は直前で説明されている`@weblogic.ejbgen.Session`アノテーションを付与したクラスについての注意事項だと思われます。  
つまり、このプロダクト特有の事情についての注意事項であり、 EJB仕様一般についての話ではありません。

3.

> そもそもCDIの@SessionScopedを付けたクラスは、EJBなのでしょうか？

CDIとEJBは別物です。`@SessionScoped`が付与されたクラスは単に`@SessionScoped`が付与されたクラス([CDI
bean](http://docs.oracle.com/javaee/7/tutorial/cdi-
basic001.htm)と呼称されることが多い)であり、EJBのSession Beanではありません。

(補足: なお、`@SessionScoped`が付与されたStateful Session
Bean、というのは[在り得ます](https://stackoverflow.com/a/10335380/4506703)。(個人的には、EJBがサーブレット呼び出しのために特別な考慮をしないといけないのは正しくないような気がしますが…))

* * *

>
> 同一セッション内で同じインスタンスを使い回すことを目的として、@SessionScopedをクラスに付ける場合、@Statefulを付ける必要はありますか？

質問文の意図する「セッション」はおそらくHTTPセッションのことだと思われますのでそれを前提に回答すると、  
`@Stateful`を付与する必要はありません。


CC BY-SA 3.0
2017-04-20T06:57:57.660
34154
2017-04-20T06:57:57.660
2017-05-23T12:38:55.307
-1
2808
34084
answer