Spring: как мне вставить HttpServletRequest в бин в области запроса? - PullRequest
86 голосов
/ 23 июля 2010

Я пытаюсь настроить bean-объект в области запросов весной.

Я успешно настроил его, поэтому компонент создается один раз за запрос. Теперь ему необходим доступ к объекту HttpServletRequest.

Поскольку компонент создается один раз для каждого запроса, я считаю, что контейнер может легко внедрить объект запроса в мой компонент. Как я могу это сделать?

Ответы [ 2 ]

121 голосов
/ 24 июля 2010

Spring предоставляет текущий объект HttpServletRequest (а также текущий объект HttpSession) через обертку объект типа ServletRequestAttributes. Этот объект-оболочка привязан к ThreadLocal и получается путем вызова метода static RequestContextHolder.currentRequestAttributes().

ServletRequestAttributes предоставляет метод getRequest() для получения текущего запроса, getSession() для получения текущего сеанса и другие методы для получения атрибутов, хранящихся в обеих областях. Следующий код, хотя и немного уродливый, должен получить текущий объект запроса в любом месте приложения:

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

Обратите внимание, что метод RequestContextHolder.currentRequestAttributes() возвращает интерфейс и должен быть приведен к типу ServletRequestAttributes, который реализует интерфейс.


Spring Javadoc: RequestContextHolder | ServletRequestAttributes

98 голосов
/ 24 июля 2010

Бины в области запроса могут быть автоматически соединены с объектом запроса.

private @Autowired HttpServletRequest request;
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...