在我的 Web 应用程序中,我有一个作用域 session Bean,除其他用途外,它还用于保存连接到底层系统所需的一些凭证信息(存储需要为底层 Web 服务访问发送的 SAML)。
我有那个 bean,它确实在调用 web 服务之前在正确的位置注入(inject)了凭证。
@Autowired
private MyScopedSession myScopedSession;
@Autowired
private SomeWebService someWebService;
public void someCall() {
...
injectSamlPart
...
}
我想添加每小时运行一次的后台任务(一个 war 打包 web 应用程序 + 一些后台任务),为此我使用了一个调度程序。问题是这个后台任务不能使用 scoped-session bean(有意义,因为它不是由 http 请求驱动的)。所以我得到了这种错误:
Scope 'session' is not active for the current thread;
但我想为我的后台任务定义一个静态凭证(例如,定义一个系统帐户等),从而为后台任务定义一种替代 bean MyScopedSession,以便 Autowiring 工作。这可能吗?
可以肯定的是,我可以将我的 bean 定义为
@Autowired
private SomeWebService someWebService;
public void someCall(MyScopedSession myScopeSession) {
...
injectSamlPart
...
}
但我不太喜欢这个,因为我不想通过参数传递我的凭证到我所有的业务服务(可能有 10 层 bean 在这上面直到我的后台任务,或者直到我的 rpc 调用)
您是否可以推荐任何解决方案或架构更改?
最佳答案
如果您的计划任务是在 spring 上下文中触发的,您可以将 Session
范围注册为 ThreadScope
并具有以下两个 LOC
ConfigurableBeanFactory factory = applicationContext.getBeanFactory();
factory.registerScope(WebApplicationContext.SCOPE_SESSION,
new SimpleThreadScope());
这应该在您的应用程序(即后台任务)开始/初始化时完成,并且应该独占您的网络应用程序。
关于java - 为后台任务替换作用域 session bean,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27522716/