gpt4 book ai didi

java - CDI 生产者回退 (ContextNotActiveException)

转载 作者:行者123 更新时间:2023-12-01 11:40:46 25 4
gpt4 key购买 nike

我们希望使用 CDI 来实现一些横切功能,例如记录审核信息、授权等。为了做到这一点,我们需要一些包含当前用户注入(inject)点的 bean,如下所示:

class AuditLogger {
@Inject
private Instance<User> currentUser;

public void log(Whatever data) {
User userWhoTriggeredIt = currentUser.get();
...
}
}

此外,我们还有一个 session 范围的用户管理器 bean,其中包含生产者方法:

@SessionScoped
class UserManager {
@Produces
@Current
public User getCurrentUser() {
//get and return the user
}
}

只要我们有一个 session 上下文启动并运行(即在我们的 Web 应用程序中),这就可以正常工作。然而,在某些情况下,没有 session 上下文,即调用某些 Web 服务或 MBean 时。在这些情况下,我们希望有一个后备生产者来提供通用的“应用程序”用户。

所以基本上在 AuditLogger我们希望从范围为 UserManager 的 session 中获取用户除非我们在 session 外运行,在这种情况下我们将使用后备“应用程序”用户。

但是,使用 Weld 1.x 似乎有点困难(我们正在 JBoss 7.2 中运行,现在无法升级,尽管我们会考虑是否 CDI 1.2 提供解决方案)。

到目前为止我们尝试过的一些选项:

  • 使用Instance.select( new AnnotationLiteral<Current>() {}).isUnsatisfied()检查是否有可用的生产者。然而,这似乎返回 false,所以当我们尝试调用 get() 时我们仍然得到 ContextNotActiveException
  • 迭代实例,即for( User u : currentUser ) ,但由于没有限定符信息,因此当我们进行 session 时很难区分正确的信息(更新:测试具有误导性,我们在这里也遇到了该异常)
  • 没有尝试过,但似乎有可能,虽然有点老套:捕获该异常并尝试后备

关于规范/最不黑客/容易出错的方法有什么想法吗?

最佳答案

Obtaining the active Context for a scope 中所述,你可以写:

@Inject
BeanManager bm;

Context context = bm.getContext(SessionScoped.class);

不幸的是,这仅允许检索 Activity 上下文,如果范围类型不存在 Activity 上下文对象,则会抛出ContextNotActiveException异常。

因此,即使存在 Context.isActive() 方法,也不可能在不依赖 ContextNotActiveException 异常机制的情况下可靠地检查上下文是否处于 Activity 状态。

关于java - CDI 生产者回退 (ContextNotActiveException),我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29543718/

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