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