Spring: HttpServletRequest'i istek kapsamlı bir bean'e nasıl enjekte edebilirim?


96

İlkbaharda istek kapsamlı bir fasulye kurmaya çalışıyorum .

Başarıyla kurdum, böylece fasulye istek başına bir kez oluşturulur. Şimdi, HttpServletRequest nesnesine erişmesi gerekiyor.

Çekirdek istek başına bir kez oluşturulduğundan, kabın çekirdeğime istek nesnesini kolayca enjekte edebileceğini düşünüyorum. Bunu nasıl yapabilirim ?

Yanıtlar:


117

İstek kapsamlı çekirdekler, istek nesnesiyle otomatik olarak kablolanabilir.

private @Autowired HttpServletRequest request;

2
Bunun için eski moda bir XML yolu var mı?
cherouvim

2
Benim için çalışmıyor (spring mvc 3.1) - belki daha yapılması gereken bir şey var mı? Samit'in çözümüyle gidiyor.
kldavis4

2
Sorun şu ki, MockMvc kullanarak doğrulayıcıları test ettiğinizde ve bu tür enjeksiyonlarda sorun yaşarsınız. Bu durumda tercih edilecek diğer çözüm olabilir
Neyko

21
HttpServletRequest'i istek kapsamlı olmayan çekirdeklere de otomatik olarak bağlamak mümkündür, çünkü HttpServletRequest Spring için, isteğin gerçek örneğinin nasıl alınacağının farkında olan bir proxy HttpServletRequest oluşturur. Bu nedenle, denetleyiciniz tek kapsamlı olsa bile isteğin otomatik olarak bağlanması güvenlidir.
vtor

3
Yay <= 3.1 kullanıcıları için uyarı otomatik kablolama testleri çalıştırırken çalışmayacaktır.
Rubens Mariuzzo

140

Spring, geçerli HttpServletRequestnesneyi ( mevcut nesnenin yanı sıra HttpSession) türdeki bir sarmalayıcı nesne aracılığıyla ortaya çıkarır ServletRequestAttributes. Bu sarmalayıcı nesnesi ThreadLocal'a bağlıdır ve staticyöntem çağrılarak elde edilir RequestContextHolder.currentRequestAttributes().

ServletRequestAttributesyöntem sağlar getRequest(), şimdiki isteği almak için getSession()her iki kapsamları saklanan özelliklerini almak için geçerli oturum ve başka yöntemler olsun. Aşağıdaki kod, biraz çirkin olsa da, uygulamanın herhangi bir yerinde size geçerli istek nesnesini alacaktır:

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

Not, RequestContextHolder.currentRequestAttributes()yöntem, bir arabirim ve ihtiyaçları döner typecasted için ServletRequestAttributesbu uygular arayüz.


Spring Javadoc: RequestContextHolder | ServletRequestAttributes


8
Enjeksiyon iyi bir çözünürlük, ancak MockMvc testinde HttpServletRequest'i enjekte eden Spring doğrulayıcılarında sorunlar buldum. Dolayısıyla, hem sahte testlerin hem de üretim kodunun düzgün çalışmasını istiyorsanız, seçim bu olmalıdır.
Neyko

@Neyko Neden? alay testi için (Birim testi?), sahte HttpServletRequest veya ne isterseniz enjekte edebilirsiniz .. değil mi? Veya MockHttpServletRequest'i kullanabilirsiniz sanırım?
wonhee

Tek kapsamlı bir hizmet örneğinde kullanmak güvenli midir?
Jin Kwon

2

Önerildiği gibi burada da enjekte edebilir HttpServletRequestbir yöntem param, örneğin gibidir:

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}
Sitemizi kullandığınızda şunları okuyup anladığınızı kabul etmiş olursunuz: Çerez Politikası ve Gizlilik Politikası.
Licensed under cc by-sa 3.0 with attribution required.