2

リクエストスコープで定義されたBeanを大量に使用するSpringMVCアプリケーションがあります。ここで、このアプリケーションの一部をこの範囲外で使用する必要があります(Magnolia CMSのqwertzジョブで)。もちろん、これは機能しません。

'requestHelper'という名前のBeanの作成中にエラーが発生しました:スコープ'request'は現在のスレッドに対してアクティブではありません

Beanのスコープを変更したり、コードを変更したりすることはできません。したがって、私の唯一の可能性は、現在のスレッドのスコープをリクエストスコープのモックアップに変更するようです。

私は次のようなことを試みました

XmlWebApplicationContext context = (XmlWebApplicationContext) ApplicationContextProvider.getApplicationContext() ;
   MockServletContext mockServletContext = new MockServletContext("/");
   context.setServletContext(mockServletContext);
   context.refresh();

ただし、これでも現在のスレッドのリクエストスコープはアクティブになりません。どうすればこれを達成できますか?

4

1 に答える 1

2

リクエストスコープは次のようにアクティブ化できます。

RequestContextHolder.setRequestAttributes(
    new ServletRequestAttributes(new MockHttpServletRequest()));     

...

((ServletRequestAttributes) RequestContextHolder.getRequestAttributes())
    .requestCompleted();
RequestContextHolder.resetRequestAttributes(); 

Thoguhこのようなハックを本番コードで使用するのは良い考えではないと思います。

于 2012-04-20T11:21:11.157 に答える