web-dev-qa-db-ja.com

Spring:HttpServletRequestをリクエストスコープのBeanに挿入するにはどうすればよいですか?

Springで request-scoped bean を設定しようとしています。

Beanがリクエストごとに1回作成されるように、正常にセットアップしました。次に、HttpServletRequestオブジェクトにアクセスする必要があります。

Beanはリクエストごとに1回作成されるため、コンテナがBeanにリクエストオブジェクトを簡単に挿入できると考えています。どうやってやるの ?

91
Leonel

要求スコープのBeanは、要求オブジェクトと自動接続できます。

private @Autowired HttpServletRequest request;
101
skaffman

Springは、HttpServletRequest型のwrapperオブジェクトを介して、現在のHttpSessionオブジェクト(および現在のServletRequestAttributesオブジェクト)を公開します。このラッパーオブジェクトはThreadLocalにバインドされ、staticメソッドRequestContextHolder.currentRequestAttributes()を呼び出すことで取得されます。

ServletRequestAttributesは、現在のリクエストを取得するgetRequest()メソッド、現在のセッションを取得するgetSession()メソッド、および両方のスコープに格納されている属性を取得する他のメソッドを提供します。次のコードは少しいですが、現在のリクエストオブジェクトをアプリケーションのどこにでも取得するはずです。

_HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
_

RequestContextHolder.currentRequestAttributes()メソッドはインターフェイスを返すため、インターフェイスを実装するServletRequestAttributesに型キャストする必要があることに注意してください。


Spring Javadoc:RequestContextHolder | ServletRequestAttributes

124
samitgaur

here のように、メソッドパラメーターとしてHttpServletRequestを挿入することもできます。例:

public MyResponseObject myApiMethod(
  ...
  HttpServletRequest request
)
0
Will Cain