私は今、多くのことを試しましたが、パズルのピースを見逃しているようです. ストーリーは次のとおりです。HttpServletRequest から SessionContext を読み取るリクエスト スコープ Bean があります。この属性はフィルターで設定されます。したがって、コードが正しいスレッドで実行されている間、これはまったく問題なく機能します。
@Component
@Scope(value = WebApplicationContext.SCOPE_REQUEST, proxyMode = ScopedProxyMode.INTERFACES)
public class SessionContextProviderImpl implements SessionContextProvider<SessionContext> {
private final HttpServletRequest _request;
@Autowired
public SessionContextProviderImpl(HttpServletRequest request) {
_request = request;
}
@Override
public SessionContext get() {
return (SessionContext) _request.getAttribute(Constants.SESSION_CONTEXT_IDENTIFIER);
}
}
今、私は Java 8s の新機能 CompletableFuture を使い始めました。リクエスト スレッドが結果を待っている間、これらの機能の 3 つを並行して計算しています。私がやりたいことは、元の http スレッドから生成された子スレッドで使用できるように、Bean または要求を昇格/引き渡し/伝播することです。特に、非同期で提供される CompletableFuture 内から HttpServletRequest から SessionContext を取得したいと考えています。
私が試したのはこれです(getの実装を置き換えました):
final HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.getRequestAttributes()).getRequest();
request.getAttribute(Constants.SESSION_CONTEXT_IDENTIFIER);
しかし、これは明らかにリクエスト スコープ Bean と同じ結果になります。「getRequest」は例外がスローされる代わりに null を返します。
3番目のアプローチとして、私はこの元の投稿を試しました:
ConfigurableBeanFactory cbf = (ConfigurableBeanFactory) beanFactory;
org.springframework.beans.factory.config.Scope simpleThreadScope = new SimpleThreadScope();
cbf.registerScope("simpleThreadScope", simpleThreadScope);
そして、SessionContextProviderImpl のスコープを「simpleThreadScope」に設定しました。残念ながら、これも機能せず、リクエスト スコープ外で使用されているという例外がスローされました。
私が使用している環境:春の注入と一緒にジャージ。
多分誰かが何か考えを持っていますか?
よろしく