Frage Spring: Wie injiziere ich eine HttpServletRequest in eine Request-Scoped Bean?


Ich versuche ein Anfrage-Bean im Frühling.

Ich habe es erfolgreich eingerichtet, so dass die Bean einmal pro Anfrage erstellt wird. Jetzt muss es auf das HttpServletRequest-Objekt zugreifen.

Da die Bean einmal pro Anfrage erstellt wird, kann der Container das Anfrageobjekt einfach in meine Bean einfügen. Wie kann ich das machen ?


75
2017-07-23 17:16


Ursprung


Antworten:


Anforderungsspezifische Beans können mit dem Anforderungsobjekt automatisch gestartet werden.

private @Autowired HttpServletRequest request;

81
2017-07-24 07:27



Der Frühling macht die Strömung sichtbar HttpServletRequest Objekt (sowie die aktuelle HttpSession Objekt) durch a Verpackung Objekt des Typs ServletRequestAttributes. Dieses Wrapper-Objekt ist an ThreadLocal gebunden und wird durch Aufrufen des static Methode RequestContextHolder.currentRequestAttributes().

ServletRequestAttributes stellt die Methode bereit getRequest() um die aktuelle Anfrage zu bekommen, getSession() um die aktuelle Sitzung und andere Methoden zum Abrufen der in beiden Bereichen gespeicherten Attribute abzurufen. Der folgende Code, obwohl ein wenig hässlich, sollte Sie das aktuelle Anforderungsobjekt irgendwo in der Anwendung erhalten:

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

Notiere dass der RequestContextHolder.currentRequestAttributes() Methode gibt eine Schnittstelle zurück und muss typecasted sein ServletRequestAttributes das implementiert die Schnittstelle.


Frühling Javadoc:  RequestContextHolder | ServletRequestAttribute


110
2017-07-24 01:00