gpt4 book ai didi

spring-aop - 如何将 HttpServletRequest 注入(inject) Spring AOP 请求(自定义场景)?

转载 作者:行者123 更新时间:2023-12-04 00:01:08 29 4
gpt4 key购买 nike

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

但我的情况是我有一个翻译服务,它目前是 session 范围的,维护用户的语言环境以进行翻译。我觉得这使服务有状态,而且我不希望它是 session 范围的,因为我认为它真的是单例的。但是有多个地方调用了翻译服务方法,因此我不想更改签名以在这些方法中添加请求/语言环境。问题是翻译服务方法的所有调用者都无权访问 HttpServletRequest(不是 Controller 方法)?我可以围绕翻译服务方法编写一个方面,并以某种方式神奇地访问 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,我不能在通知中获取请求吗?有解决方法吗?

最佳答案

Can I write an aspect around the translation service methods and somehow magically get access to HttpServletRequest regardless of whether it is available in the caller's context or not?



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

最简单的方法是依靠 RequestContextHolder .在每个请求中, DispatcherServlet绑定(bind)当前 HttpServletRequeststatic ThreadLocal RequestContextHolder 中的对象.您可以在同一 Thread 中执行时检索它和
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();

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

关于spring-aop - 如何将 HttpServletRequest 注入(inject) Spring AOP 请求(自定义场景)?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/19271807/

29 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com