【问题标题】:How to inject HttpServletRequest into a Spring AOP request (custom scenario)?如何将 HttpServletRequest 注入 Spring AOP 请求(自定义场景)?
【发布时间】:2013-10-16 19:10:24
【问题描述】:

我知道围绕控制器方法编写 AOP 建议的标准方法,并且如果在控制器方法中声明,您可以访问 HttpServletRequest arg。

但我的情况是我有一个翻译服务,它目前是会话范围的,维护用户的语言环境以进行翻译。我觉得这使服务有状态,而且我不希望它是会话范围的,因为我认为它真的是单例的。但是有多个地方调用了翻译服务方法,因此我不想更改签名以在这些方法中添加请求/语言环境。问题是翻译服务方法的所有调用者都无权访问 HttpServletRequest(不是控制器方法)?我可以围绕翻译服务方法编写一个方面,并以某种方式神奇地访问 HttpServletRequest,而不管它在调用者的上下文中是否可用?

@Service
public class TranslationService {
    public void translate(String key) {
        ...
    }
}

@Aspect
@Component
public class LocaleFinder {
    @PointCut("execution(* TranslationService.translate(..))")
    private void fetchLocale() {}

    @Around("fetchLocale()") // in parameter list
    public void advice(JoinPoint joinpoint, HttpServletRequest request) { .... } 
}

如果现在 translate 的调用者没有 HttpServletRequest,我不能在通知中获取请求吗?有解决办法吗?

【问题讨论】:

    标签: spring-aop


    【解决方案1】:

    我可以围绕翻译服务的方法写一个方面吗? 不知何故神奇地访问 HttpServletRequest 它是否在调用者的上下文中可用?

    不容易。实际上,这需要付出很多努力。

    最简单的方法是依赖RequestContextHolder。在每个请求中,DispatcherServlet 将当前的HttpServletRequest 绑定到RequestContextHolder 中的static ThreadLocal 对象。您可以在同一个Thread 中执行时检索它

    HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
    

    您可以在advice() 方法中执行此操作,因此无需声明参数。

    【讨论】:

      猜你喜欢
      • 2011-03-20
      • 2015-08-16
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2015-08-23
      • 1970-01-01
      • 2013-07-13
      • 1970-01-01
      相关资源
      最近更新 更多