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


95

SpringでリクエストスコープのBeanを設定しようとしています。

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

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

回答:


114

リクエストスコープのBeanは、リクエストオブジェクトと自動ワイヤリングできます。

private @Autowired HttpServletRequest request;

2
これには昔ながらのXML方法がありますか?
cherouvim 2010

2
私(春mvc 3.1)のために動作しません-たぶん実行する必要があるもっと何かがありますか?Samitのソリューションを使用します。
kldavis4

2
問題は、MockMvcとこの種の注入を使用してバリデーターをテストすると、問題が発生することです。この場合、他の解決策が優先される可能性があります
Neyko 2013

21
HttpServletRequestの場合、Springはリクエストの実際のインスタンスを取得する方法を認識しているプロキシHttpServletRequestを生成するため、HttpServletRequestをリクエストスコープ以外のBeanに自動ワイヤリングすることもできます。そのため、コントローラがシングルトンスコープの場合でも、リクエストを自動ワイヤリングしても安全です。
vtor

3
Spring <= 3.1ユーザーに対する警告は、自動配線がテストの実行で機能しないためです。
Rubens Mariuzzo

138

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

ServletRequestAttributes方法を提供しgetRequest()、現在の要求を取得するgetSession()スコープの両方に格納された属性を取得するために、現在のセッションと他の方法を取得します。次のコードは少し醜いですが、現在のリクエストオブジェクトをアプリケーションのどこにでも取得できます。

HttpServletRequest curRequest = 
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();

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


Spring Javadoc: RequestContextHolder | ServletRequestAttributes


8
インジェクションは良い解決策ですが、HttpServletRequestをインジェクトするSpringバリデーターをテストするMockMvcで問題が見つかりました。したがって、モックテストと本番用コードの両方を適切に実行したい場合は、これが選択になります。
Neyko 2013

@Neykoなんで?モックテスト(ユニットテスト?)の場合、モックHttpServletRequestまたは必要なものを挿入できます。または、MockHttpServletRequestを使用できますか?
ウォンヒ

シングルトンスコープのサービスインスタンスで使用しても安全ですか?
ジンクォン

2

ここで提案さているHttpServletRequestように、メソッドパラメータとしてを注入することもできます。例:

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}
弊社のサイトを使用することにより、あなたは弊社のクッキーポリシーおよびプライバシーポリシーを読み、理解したものとみなされます。
Licensed under cc by-sa 3.0 with attribution required.