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にバインドされ、メソッドを呼び出すことによって取得されます。ServletRequestAttributesstaticRequestContextHolder.currentRequestAttributes()
ServletRequestAttributes方法を提供しgetRequest()、現在の要求を取得するgetSession()スコープの両方に格納された属性を取得するために、現在のセッションと他の方法を取得します。次のコードは少し醜いですが、現在のリクエストオブジェクトをアプリケーションのどこにでも取得できます。
HttpServletRequest curRequest =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
このRequestContextHolder.currentRequestAttributes()メソッドはインターフェースを返すため、インターフェースServletRequestAttributesを実装する型キャストする必要があることに注意してください。
Spring Javadoc: RequestContextHolder | ServletRequestAttributes