我知道围绕控制器方法编写AOP建议的标准方法,并且如果在控制器方法中声明,则可以访问HttpServletRequest arg.
但我的情况是我有一个翻译服务,目前是会话范围的维护用户的翻译区域设置.我觉得这使得服务状态有限,而且我不希望它是会话范围的,因为我认为它确实是Singleton.但是有多个地方调用了翻译服务方法,因此我不想更改签名以在这些方法中添加请求/语言环境.问题是翻译服务方法的所有调用者都无法访问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) { .... }
}
Run Code Online (Sandbox Code Playgroud)
如果现在,translate的调用者没有HttpServletRequest,我不能在建议中得到请求吗?有解决方法吗?
Sot*_*lis 44
我是否可以围绕翻译服务方法编写一个方面,并以某种方式神奇地访问HttpServletRequest,无论它是否在调用者的上下文中可用?
不容易.实际上,这需要付出很多努力.
简单的方法是依靠RequestContextHolder.在每个请求中,DispatcherServlet将当前绑定HttpServletRequest到static ThreadLocal对象中RequestContextHolder.在同一个执行时,您可以检索它Thread与
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
Run Code Online (Sandbox Code Playgroud)
您可以在advice()方法中执行此操作,因此无需声明参数.
| 归档时间: |
|
| 查看次数: |
14767 次 |
| 最近记录: |