Есть ли статический способ получить 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);
}