私は別のスレッドに私の春WebMVCアプリケーションの一部の処理を外部委託することを、問題を抱えています。私はグローバルな要求を使用するクラス、userRightServiceを、使用したいまでそれは、簡単に十分と作品でした。これは、スレッドでは使用できません、と私たちはかなり理解しやすいです、問題を取得します。
これは私のエラーです:
java.lang.RuntimeException:
org.springframework.beans.factory.BeanCreationException: Error creating bean
with name 'scopedTarget.userRightsService': Scope 'request' is not active
for the current thread; consider defining a scoped proxy for this bean if
you intend to refer to it from a singleton; nested exception is
java.lang.IllegalStateException: Cannot ask for request attribute -
request is not active anymore!
さて、十分にクリアしてください。私は、このソリューションを実装することにより、要求コンテキストを維持しようとしています:
これは私の実行可能なクラスです。
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class myThread implements Runnable {
private RequestAttributes context;
public DataExportThread(RequestAttributes context) {
this.context = context;
}
public void run() {
RequestContextHolder.setRequestAttributes(context);
そして、それが生み出します。この場所:
final DataExportThread dataExportThread =
new myThread(RequestContextHolder.currentRequestAttributes());
final Thread thread = new Thread(myThread);
thread.setUncaughtExceptionHandler((t, e) -> {...});
thread.start();
私の知る限り理解されるように、我々はスレッドでcurrentRequestAttributesを保存し、実行しているときに、我々は彼らcurrentRequestAttributesを復元...私には固体に聞こえますが、エラーがまだそこにあります。私は私の場合のためのソリューションを適応させるいくつかのミスを犯したと思います。多分誰かがエラーを見つける私を助けることができます。
私は別のソリューションとstackoverflowの-スレッドの多くを経て前に、私は誰かが実装で間違いを見つける私を助けることを願って、私は他に次のものを試すことができるように、(下記参照)が、これは私にとって最も明確かつ最も簡単なように見えましたそれは間違ったアプローチである理由や説明。
- スコープ「セッションの現在のスレッドのアクティブではありません。IllegalStateExceptionが:いいえスレッドバウンド要求FOUND
- マルチスレッドのWebアプリケーションに要求スコープの豆へのアクセス
- 実際のWebリクエストのリクエストスコープのBeanの外を使用して
- InheritableThreadLocal値ExecutorServiceのスレッドによって継承されていません
- 非同期タスク実行のリクエストスコープを有効にする方法
- アプリケーション内のすべてのスレッドのためにはThreadContextを設定します
- スレッド間Spring MVCのリクエストスコープのコンテキスト
私はすでに成功せず、このいずれかを試してみました:
それが問題だ場合:
<org.springframework-version>4.3.4.RELEASE</org.springframework-version>
ところで:私は、それは、要求がスレッドで必要とされていないが、それは非常にそのような場合には複雑だと私は本当に私はこの問題を回避することを願っていること、再構築へのより良い方法でアプリケーションになることを知っています。
-
EDIT1:
スレッドで作成することはできませんビーンは次のように起動します:
@Service("userRightsService")
@Scope(value = "request", proxyMode = ScopedProxyMode.TARGET_CLASS)
public class UserRightsService {
-
EDIT2:
また、私はこれを試してみました:
しかし、コンテキストは常に空です...
人のために、誰が検索しています。Master_Exのヒントの助けを借りて、私は解決策を見つけました:
実行可能に:
private HttpServletRequest request;
public void run() {
final RequestContextListener rcl = new RequestContextListener();
final ServletContext sc = request.getServletContext();
rcl.requestInitialized(new ServletRequestEvent(sc, request));
そしてUserRightServiceに、私は次のことを行う関数への呼び出しを行います。
SecurityContext context = SecurityContextHolder.getContext();
Authentication auth = context.getAuthentication();
context.setAuthentication(getDataExportAuthentication(exportingUser));
Master_Ex @さんはあなたのポストは非常に有用だった、ありがとうございました。私は、そうでない場合は、私が正しいものとしてそれをマークしているだろう、あなたに恵みを与えるために手遅れだということをとても残念。