Доступ к объекту HttpServletRequest в обычном классе Java из Spring - PullRequest
15 голосов
/ 19 марта 2012

У меня есть нормальный класс Java в веб-приложении Spring MVC 3.06.

В этом классе я хотел бы внедрить или получить объект HttpServletRequest в методе.

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

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

Желательно, не зависит от сервера приложений.

Я видел

(HttpServletRequest) RequestContextHolder.getRequestContext().getExternalContext().getNativeRequest() 

, но, похоже, это не такработа для Spring MVC 3.06.RequestContextHolder не имеет метода getRequestContext().

Ответы [ 2 ]

28 голосов
/ 19 марта 2012

Используйте

((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();

Я не уверен, откуда у вас RequestContextHolder.getRequestContext(), это совершенно неправильно.

это нестабильный доступ к нему таким образом?

Нет, он достаточно стабилен, при условии, что вы всегда выполняете код как часть потока запроса HttpServlet. Основная проблема в том, что да, это уродливо, и это делает ваш код сложным для тестирования. Этого достаточно, чтобы не использовать его.

Если вы должны использовать его, то отделите его от своего кода, например,

public void doSomething() {
    HttpServletRequest request = ((ServletRequestAttributes)RequestContextHolder.getRequestAttributes()).getRequest();
    doSomething(request);
}

void doSomething(HttpServletRequest request) {
   // put your business logic here, and test this method
}
0 голосов
/ 05 августа 2016

@ Context HttpServletRequest httpServletRequest = null;

используйте это

...