Есть ли статический способ получить HttpServletRequest текущего запроса
Я использую аннотации Spring, я могу передать HttpRequestContext
из Контроллера в Службу.
Я ищу статический способ или лучшее решение, чем прохождение RequestContext
.
Ответы
Ответ 1
Я не думаю, что это хорошая идея. Уровень сервиса не должен знать или заботиться о том, имеет ли он дело с клиентом HTTP.
Статика не похожа на правильную идею. HttpRequestContext должен быть связан с экземпляром HttpRequest, а не с определенным классом.
Лучший дизайн, на мой взгляд, позволит получить все необходимые сервисы из контекста и передать его. Не нужно, чтобы служба была связана с HTTP или веб-уровнем.
Ответ 2
Если вы используете spring, вы можете сделать следующее:
public static HttpServletRequest getCurrentHttpRequest(){
RequestAttributes requestAttributes = RequestContextHolder.getRequestAttributes();
if (requestAttributes instanceof ServletRequestAttributes) {
HttpServletRequest request = ((ServletRequestAttributes)requestAttributes).getRequest();
return request;
}
logger.debug("Not called in the context of an HTTP request");
return null;
}
Ответ 3
Или способ java8
public static Optional<HttpServletRequest> getCurrentHttpRequest() {
return Optional.ofNullable(RequestContextHolder.getRequestAttributes())
.filter(requestAttributes -> ServletRequestAttributes.class.isAssignableFrom(requestAttributes.getClass()))
.map(requestAttributes -> ((ServletRequestAttributes) requestAttributes))
.map(ServletRequestAttributes::getRequest);
}