2017-05-30 18 views
1

リクエストスコープのBeanをオートワイヤする方法が他にもあるのだろうかと思います。だから、今の私には、構成ファイル内beanを作成しました:リクエストスコープのBeanをオートワイヤする方法

@Bean 
@Scope(value=WebApplicationContext.SCOPE_REQUEST, proxyMode=ScopedProxyMode.DEFAULT) 
public List<String> stringBean(){ 
    return new ArrayList<String>(); 
} 

ので、通常、私はbeanを使用するapplicationContextをautowireます:

@Autowired 
private ApplicationContext context; 

@Override 
public void anyName() { 
    List<String> list = (List<String>) getContext().getBean("stringBean"); 
} 

これは完全に正常に動作します。しかし、私はコンテキストと、キャストの必要性をautowireしたくない。だから私は、直接豆をautowireすることを試みた:

@Autowired 
private List<String> stringBean; 

私は、要求が開始される前に、Beanが作成されていないためにも明らかであるものをアプリケーションの起動によって例外が発生しました。

org.springframework.beans.factory.BeanCreationException: Error creating bean with name 'stringBean': 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: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request. 

リクエストスコープのBeanをオートワイヤする他の方法はありますか?

+1

'あなたがいずれかを設定していない場合ScopedProxyMode.DEFAULT'は、NOを意味します

は、いくつかの有用なドキュメントに見てください(プロキシは作成されません)。 'CGLIB'プロキシを使うために' ScopedProxyMode.TARGET_CLASS'を使ってみてください。 – alfcope

+0

@alfcopeはこれが動作しているようです。違いを説明できますか?答えにもなることができます。 – Patrick

+0

確かに、そこにあります。それはすべてプロキシについてです。 – alfcope

答えて

3

ScopedProxyMode.DEFAULT設定していない場合は、いいえ(プロキシは作成されません)を意味します。 CGLIBプロキシを使用するにはScopedProxyMode.TARGET_CLASSを試してください

すでにご存知のように、シングルトンBeanは一度だけ作成され、依存関係注入は初期化時に行われます。あなたがあなたの質問で言ったように、リクエストスコープのBeanの場合、その時点でBeanは存在せず、例外が発生します。

これを避けるには、SpringにプロキシBeanを使用させたいということを知らせる必要があります。プロキシBeanは、Springによって動的に作成され、ターゲットと同じパブリックインターフェイスを公開するBeanです。このプロキシBeanは、SpringがBeanに挿入するもので、そのメソッドを呼び出すときに、その要求に対して作成された実際のものに呼び出しを委任します。

インターフェイス(ScopedProxyMode.INTERFACES)またはCGLIBScopedProxyMode.TARGET_CLASS)を使用する場合、JDK dynamic proxiesの2つのプロキシメカニズムがあります。

私はあなたがそのアイデアを得ることを願っています。

Scoped beans as dependencies

Choosing the type of proxy to create

Proxying mechanisms

Aspect Oriented Programming with Spring

関連する問題