2012-02-07 15 views
0

Webコンテキスト内で設定されたSpring内にセッションスコープのBeanがあります。 Callableとして実行されるタスクがあり、そのスレッド内からこのBeanにアクセスする必要があります。私はこれをどのように達成すべきですか? 「セッション」は私はこのようなルックスを注入しています現在のスレッドセッションスコープのBeanをスレッドに自動バインドする(Spring)

セッションスコープのBeanのアクティブでない

範囲::私は単純にBeanをオートワイヤリングしようとすると、私はエラーメッセージが表示されます

<bean id="userInfo" class="com.company.web.UserInfoBean" scope="session"> 
    <aop:scoped-proxy /> 
</bean> 

そして、私はこのようなルックスに注入しようとしているクラス:

@Component 
@Scope(value = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class GenerateExportThread implements Callable<String> { 
    ... 
    // this class contains an @Autowired UserInfoBean 
    @Autowired 
    private ISubmissionDao submissionDao; 
    ... 
} 
そのBeanがセッションスコープであるため、そのUserInfoBeanを

@Autowired 
private GenerateExportThread generateExportThread; 

@Autowired 
private AsyncTaskExecutor taskExecutor; 

public void myMethod() { 
... 
    Future<String> future = taskExecutor.submit(new ThreadScopeCallable<String>(generateExportThread)); 
... 
} 

ISubmissionDao実装が正しく注入されますが、ない:210

最後には、呼び出し可能は次のように起動されています。スレッド起動時にオブジェクトをあるセッションから別のセッションにコピーする必要がある場合は手動でコードを実行しても問題ありませんが、これを行う方法はわかりません。任意のヒントが評価されます。ありがとう!

あなたのスレッド・スコープのBean:あなたの要求のスレッドで

@Component 
@Scope(value = "thread", proxyMode = ScopedProxyMode.TARGET_CLASS) 
public class GenerateExportThread implements Callable<String> { 
    ... 
    // this class contains an @Autowired UserInfoBean 
    private ISubmissionDao submissionDao; 

    public void setSubmissionDao(ISubmissionDao submissionDao) { 
     this.submissionDao = submissionDao; 
    } 
    ... 
} 

答えて

4

は手動注入ですか

... 
@Autowired // This should work as a request has an implicit session 
private ISubmissionDao submissionDao; 

@Autowired // This should also work: the request thread should have a thread-scoped exportThread 
private GenerateExportThread generateExportThread; 

... 
generateExportThread.setSubmissionDao(submissionDao); 
String result = generateExportThread.call(); // Or whatever you use to run this thread 
+0

を私はこれが働いていたと思ったが、それは非常にではありません。スレッド内からsubmissionDaoを呼び出すと、submissionDaoでUserInfoBeanオブジェクトにアクセスすることはできません。これは、エラーメッセージを表示します:スレッドバインドされた要求が見つかりません:実際のWeb要求以外の要求属性を参照していますか、元の受信スレッド外の要求を処理していますか? – Markus

+1

submissionDaoのUserInfoBeanオブジェクトをスレッド外から手動で設定すると、すべて正常に動作します。私はこの問題を解決するために必要なものすべてをくれたので、私はこの答えを受け入れます。ありがとう。 – Markus

関連する問題