我知道围绕控制器方法编写AOP建议的标准方法,如果在控制器方法中声明,您可以访问HttpServletRequest参数。
但我的场景是,我有一个翻译服务,它当前在会话范围内维护用户的翻译语言环境。我觉得这使服务有状态,而且我不希望它是会话范围的,因为我认为它实际上是单例的。但是调用翻译服务方法的地方有很多,因此我不想更改签名以在这些方法中添加请求/语言环境。问题是翻译服务方法的所有调用方都无权访问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,我不能在通知中获得请求吗?是否有解决方法?
您应该能够在aspect中自动连接HttpServletRequest。Spring以这种方式向当前线程本地请求实例提供代理。
所以只需添加:
@Autowired private HttpServletRequest request;
到你的方面。更好的方法是使用构造函数注入。
我是否可以围绕翻译服务方法编写一个方面,并以某种方式神奇地访问HttpServletRequest,而不管它是否在调用方的上下文中可用?
不容易。实际上,这需要很大的努力。
简单的方法是依靠Request estContextHolder
。在每个请求中,DispatcherServlet
将当前HttpServletRequest
绑定到Request estContextHolder
中的静态ThreadLocal
对象。您可以在同一个Thread
中执行时检索它
HttpServletRequest request = ((ServletRequestAttributes) RequestContextHolder.currentRequestAttributes()).getRequest();
您可以在Advisory()
方法中执行此操作,因此不需要声明参数。
问题内容: 我正在尝试在Spring中建立一个请求范围的bean。 我已经成功设置好了,所以每个请求创建一次bean。现在,它需要访问HttpServletRequest对象。 由于该bean是每个请求创建一次的,所以我认为容器可以轻松地将请求对象注入到我的bean中。我怎样才能做到这一点 ? 问题答案: 可以将请求范围的Bean与请求对象自动连接。
我有一个基于令牌的用户身份验证的Jersey REST应用程序。当请求传入时,会创建一个自定义的对象,并将其作为一个属性添加到 的用法,我想知道是否可以使用injection将这个< code>RestContext注入到我的资源和其他过滤器中(例如,我有一个过滤器,它从< code>RestContext中创建一个< code>SecurityContext),但是我找不到答案。一般来说,我如何
问题内容: 我有灰熊提供的球衣。 我有一个实现类。但是,为所有传入请求创建一次此类。因此,这样做: 该为空。我可以将上下文注入到被调用的实际端点中,但这相当粗陋和丑陋,对我来说真的没有用;因为我希望记录各种请求。理想情况下,希望在请求的ResponseFilter端获取此对象。 必须有一种简单的方法来执行此操作。到目前为止,我所看到的所有问题/答案都不适用于Grizzly,也无法插入REST端点调
问题内容: 我正在使用ejb 3并尝试@Inject HttpServletRequest,但是在部署时发生异常。 码: 例外: 我该怎么办? 问题答案: HttpServletRequest的生命周期由EJB / Web容器而不是CDI容器管理。尝试注入它会导致问题,因为通常会有很多接口实现,并且您的CDI容器没有足够的信息来决定要注入哪种实现。即使您成功注入了它的实例,它也 不会 与EJB容器