gpt4 book ai didi

jakarta-ee - CDI SessionScoped 托管 bean 中的 PostConstruct

转载 作者:行者123 更新时间:2023-12-03 21:59:09 25 4
gpt4 key购买 nike

短篇小说:我有一个 CDI @SessionScoped bean(注释来自 javax.enterprise.context 而不是来自 javax.faces)调用UserContextBean。我想在创建 HTTP session 时实际执行一些操作。

所以我自然而然地假设 @PostConstruct 可以解决这个问题:在构造此 bean 的实例时只调用一次。但是,根据文档 here ,他们说调用了 PostConstruct 方法:

When the managed bean is injected into a component, CDI calls the method after all injection has occurred and after all initializers have been called.

我原以为每个 session 都会调用一次 post 构造方法。但是,实践与文档一致。此 bean 被注入(inject)到 @RequestScoped bean(也称为 CDI)中,该 bean 充当 JSF 页面的支持 bean,为每个请求 调用 PostConstruct 方法。

我(现在)意识到这就是行为。但是还有其他方法可以在每次 session 初始化时执行一次吗?

一些代码,虽然不是很相关:

@Named(UserContextBean.BEAN_NAME)
@SessionScoped
public class UserContextBean implements Serializable {

...

@PostConstruct
private void createSession() {
System.out.println("UserContext created.");
}
}

我在其中注入(inject)的请求范围 bean:

public abstract class WebPageDataProvider extends AbstractViewDataProvider {

@Inject
private UserContextBean userContext;

我还想使用 HttpSessionListener 并初始化 session bean,但听起来已经很乱了。

编辑

现在才注意到,甚至还没有创建 HTTP session 。如果我通过调用 getSession(true) “手动”创建 session (出于测试目的,我在阶段监听器中执行此操作,但只是因为它已经存在)那么一切都会按预期进行。

最佳答案

HttpSessionListener 是您最好的选择。您可以做的是将 SessionScoped 组件注入(inject)监听器并在那里设置值。

关于jakarta-ee - CDI SessionScoped 托管 bean 中的 PostConstruct,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/16480893/

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