Springで request-scoped bean を設定しようとしています。
Beanがリクエストごとに1回作成されるように、正常にセットアップしました。次に、HttpServletRequestオブジェクトにアクセスする必要があります。
Beanはリクエストごとに1回作成されるため、コンテナがBeanにリクエストオブジェクトを簡単に挿入できると考えています。どうやってやるの ?
要求スコープのBeanは、要求オブジェクトと自動接続できます。
private @Autowired HttpServletRequest request;
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
here のように、メソッドパラメーターとしてHttpServletRequest
を挿入することもできます。例:
public MyResponseObject myApiMethod(
...
HttpServletRequest request
)