14

私は今、多くのことを試しましたが、パズルのピースを見逃しているようです. ストーリーは次のとおりです。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」に設定しました。残念ながら、これも機能せず、リクエスト スコープ外で使用されているという例外がスローされました。

私が使用している環境:春の注入と一緒にジャージ。

多分誰かが何か考えを持っていますか?

よろしく

4

2 に答える 2