这是一个更普遍的Spring问题,不一定是Spring Social Facebook问题;但是,我在这里提出这个问题是因为我不清楚Spring是如何管理传递给控制器构造函数的Facebook引用的。
我在Spring启动应用程序版本1.5.3.RELEASE中运行它。
我已经搜索了很多关于范围代理如何工作以及控制器是否是单身等等的事情。但是对于这个特定的用例,我仍然不清楚某些事情。我关心的是两个或多个同时请求是否会导致一个引用干扰另一个引用。在我看来,无论作用域代理解决方案如何,都会发生冲突。为了解决这个问题,我将一个Facebook和ConnectionRepository对象注入到包含在Provider类中的控制器构造函数中。
@Inject
public CopyGroupController(
Provider<Facebook> facebook,
Provider<ConnectionRepository> connectionRepository) {
它似乎注入了有意义的数据;但在尝试运行此代码时:
@PostConstruct
public void init() {
ConnectionRepository repo = connectionRepository.get();
this.userManager.createOrGetUser(
repo.findPrimaryConnection(Facebook.class));
}
发生此故障:
java.lang.IllegalStateException: No thread-bound request found: Are you referring to request attributes outside of an actual web request, or processing a request outside of the originally receiving thread? If you are actually operating within a web request and still receive this message, your code is probably running outside of DispatcherServlet/DispatcherPortlet: In this case, use RequestContextListener or RequestContextFilter to expose the current request.
这会产生更多的不确定性,因为我认为FacebookTemplate是作为请求或会话范围的bean管理的,并且它将作为提供者注入,因此该对象将驻留在ThreadLocale上;所以两个或多个并发请求不会发生冲突。在控制器单例构造函数中传递请求范围的bean对我来说也没有任何意义。所以我很困惑为什么用户特定的引用甚至会被传递给一个只能被调用一次的构造函数。
我尝试在构造函数中设置断点来验证是否存在冲突;但会出现与上述相同的错误。有人可以向我解释这是否是一个问题,如果是的话;如何解决它是最好,最现代的方式。
非常感谢任何帮助。 提前谢谢。