SpringでリクエストスコープのBeanを設定しようとしています。
リクエストごとに1回Beanが作成されるように設定しました。次に、HttpServletRequestオブジェクトにアクセスする必要があります。
Beanはリクエストごとに1回作成されるので、コンテナがリクエストオブジェクトをBeanに簡単に挿入できると考えています。どうやってやるの ?
SpringでリクエストスコープのBeanを設定しようとしています。
リクエストごとに1回Beanが作成されるように設定しました。次に、HttpServletRequestオブジェクトにアクセスする必要があります。
Beanはリクエストごとに1回作成されるので、コンテナがリクエストオブジェクトをBeanに簡単に挿入できると考えています。どうやってやるの ?
回答:
リクエストスコープのBeanは、リクエストオブジェクトと自動ワイヤリングできます。
private @Autowired HttpServletRequest request;
Springは、型のラッパーオブジェクトを通じて現在のHttpServletRequest
オブジェクト(および現在のHttpSession
オブジェクト)を公開します。このラッパーオブジェクトはThreadLocalにバインドされ、メソッドを呼び出すことによって取得されます。ServletRequestAttributes
static
RequestContextHolder.currentRequestAttributes()
ServletRequestAttributes
方法を提供しgetRequest()
、現在の要求を取得するgetSession()
スコープの両方に格納された属性を取得するために、現在のセッションと他の方法を取得します。次のコードは少し醜いですが、現在のリクエストオブジェクトをアプリケーションのどこにでも取得できます。
HttpServletRequest curRequest =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
このRequestContextHolder.currentRequestAttributes()
メソッドはインターフェースを返すため、インターフェースServletRequestAttributes
を実装する型キャストする必要があることに注意してください。
Spring Javadoc: RequestContextHolder | ServletRequestAttributes