Доступ к объекту HttpServletRequest в обычном классе Java из Spring

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

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

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

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

Предпочтительно не зависящий от сервера процесс.

Я видел

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

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

Ответ 1

Использование

((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
}

Ответ 2

если вы используете Spring MVC, вы можете найти HttpServletRequest следующим образом.

@RequestMapping("/part of requesturl")
@ResponseBody String YOUR_METHOD_NAME(HttpServletRequest request)
{
String YOUR_PARAMETER = request.getParameter("YOUR_PARAETER_NAME");
}

Вы также можете вставить ответ HttpServletResponse, если хотите..

Ответ 3

@Context HttpServletRequest httpServletRequest = null;

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