Ответ 1
Объектно-ориентированный beans может быть автообновлен с объектом запроса.
private @Autowired HttpServletRequest request;
Я пытаюсь настроить область запроса bean в Spring.
Я успешно настроил его, поэтому bean создается один раз за запрос. Теперь ему нужно получить доступ к объекту HttpServletRequest.
Так как bean создается один раз за запрос, я считаю, что контейнер может легко ввести объект запроса в мой bean. Как я могу это сделать?
Объектно-ориентированный beans может быть автообновлен с объектом запроса.
private @Autowired HttpServletRequest request;
Spring предоставляет текущий объект HttpServletRequest
(а также текущий объект HttpSession
) через объект-оболочку типа ServletRequestAttributes
. Этот объект-оболочка привязан к ThreadLocal и получен путем вызова метода static
RequestContextHolder.currentRequestAttributes()
.
ServletRequestAttributes
предоставляет метод getRequest()
для получения текущего запроса getSession()
, чтобы получить текущий сеанс и другие методы для получения атрибутов, хранящихся в обоих областях. Следующий код, хотя и немного уродливый, должен предоставить вам текущий объект запроса в любом месте приложения:
HttpServletRequest curRequest =
((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes())
.getRequest();
Обратите внимание, что метод RequestContextHolder.currentRequestAttributes()
возвращает интерфейс и должен быть введен в тип ServletRequestAttributes
, который реализует интерфейс.
Spring Javadoc: RequestContextHolder | ServletRequestAttributes
Как предлагается здесь, вы также можете ввести HttpServletRequest
в качестве параметра метода, например:
public MyResponseObject myApiMethod(HttpServletRequest request, ...) {
...
}