Spring: hoe injecteer ik een HttpServletRequest in een request-scoped bean?

Ik probeer een verzoek-scoped beanin het voorjaar.

Ik heb het zo ingesteld dat de bean eenmaal per verzoek wordt gemaakt. Nu moet het toegang krijgen tot het HttpServletRequest-object.

Omdat de bean eenmaal per verzoek wordt gemaakt, denk ik dat de container het verzoekobject gemakkelijk in mijn bean kan injecteren. Hoe kan ik dat doen?


Antwoord 1, autoriteit 100%

Spring onthult het huidige HttpServletRequest-object (evenals het huidige HttpSession-object) via een wrapper-object van het type ServletRequestAttributes. Dit wrapper-object is gebonden aan ThreadLocal en wordt verkregen door de static-methode RequestContextHolder.currentRequestAttributes()aan te roepen.

ServletRequestAttributesbiedt de methode getRequest()om het huidige verzoek op te halen, getSession()om de huidige sessie op te halen en andere methoden om de attributen die in beide scopes zijn opgeslagen. De volgende code, hoewel een beetje lelijk, zou je het huidige aanvraagobject overal in de applicatie moeten geven:

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

Merk op dat de methode RequestContextHolder.currentRequestAttributes()een interface retourneert en moet worden getypecast naar ServletRequestAttributesdie de interface implementeert.


Spring Javadoc:RequestContextHolder| ServletRequestAttributes


Antwoord 2, autoriteit 84%

Beans met verzoekbereik kunnen automatisch worden verbonden met het verzoekobject.

private @Autowired HttpServletRequest request;

Antwoord 3, autoriteit 3%

Zoals voorgesteld hierkun je ook de HttpServletRequestals methodeparameter, bijvoorbeeld:

public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
    ...
}

Other episodes