残念ながら、それは Web サービスの仕組みではありません。ステートフル Bean は、ステートレス Bean に対してのみステートフルです。そして、クライアントのためではありません。そして、それはいくつかの理由で非常に危険です:
- ステートレス Bean は、呼び出しの状態をステートフル参照に保存します。ただし、ステートレス Bean の次の呼び出しは、別のコンテキストまたは別のクライアントによって発生する可能性があります。
- ステートフル Bean は、ステートレス Bean がまだ生きているかプール内にある間にコンテナーによって破棄される可能性があります。
ステートフル Bean は、リモート呼び出しまたは Web アプリケーションで使用できますが、Web サービスのコンテキストでは使用できません。
Web サービスは、アプリケーションの状態のない定義ごとです。Java EE-Servlet はリクエストをリッスンし、インスタンスのプールから 1 つのステートレス Bean 実装を呼び出します。
ステートフル Web サービスを本当に実装したい場合は、自分で実装する必要があります。次の例は、Java EE 6 コンテナーで機能します。
/// Client depended values(your statefull bean)
public class SessionValues {
private final List<String> values = new ArrayList<String>();
public void addValue(String s){
values.add(s);
}
public List<String> loadValues(){
return Collections.unmodifiableList(values);
}
}
セッションをシングルトン(独自のプール)に保存できます
@Singleton
@Startup
public class StatefullSingleton {
private final Map<String, SessionValues> sessions = new Hashtable<String, SessionValues>();
@Lock(LockType.READ)
public void addValue(String sessionId, String value) {
if (!sessions.containsKey(sessionId))
sessions.put(sessionId, new SessionValues());
SessionValues p = sessions.get(sessionId);
p.addValue(value);
}
@Lock(LockType.READ)
public List<String> loadValues(String sessionId) {
if (sessions.containsKey(sessionId))
return sessions.get(sessionId).loadValues();
else
return new ArrayList<String>();
}
}
ステートレス Web サービス Bean にシングルトンを注入します (プール、シングルトン、およびシングルトンの呼び出しは Java EE コンテナーによって管理されます)。
@Stateless
@WebService
public class WebserviceBean {
@Inject
private StatefullSingleton ejb;
public void addvalue(String sessionId, String value) {
ejb.addValue(sessionId, value);
}
public List<String> loadValues(String sessionId) {
return ejb.loadValues(sessionId);
}
}
上記の例は単なるパターンです。本番環境で実装する場合は、セッション ID とマルチスレッドに十分注意する必要があります。
編集:不要な @localBean を削除します