如何强制托管bean首先初始化?

时间:2012-09-07 02:34:48

标签: jsf

我为每个用户都有一个导航管理bean。

我需要先在任何其他bean之前初始化,因为bean需要一个值。

我可以知道我该怎么做吗?

我尝试了eager="true",但它不起作用。

通过faceconfig的任何快速简便的解决方案将不胜感激。

3 个答案:

答案 0 :(得分:2)

只需在bean @PostConstruct中执行所需的初始化作业。

@PostConstruct
public void init() {
    // Here.
}

第一次从另一个bean注入/引用bean时会调用它。

eager=true仅适用于应用程序范围的bean。

答案 1 :(得分:0)

从我看到你应该引用另一个bean。让我们假设一个实用程序类可以从上下文中提取bean。

基本上 - >

//Bean A
public void doSomething()
{
  String required = Utility.getBeanB().getRequiredValue();
  use(required);
}
...
//Bean B
public String getRequiredValue()
{
  return "Hi, I'm a required value";
}

我有几个大型网络应用程序,它们有一个“会话Bean”,可以存储用户首选项,共享对象等内容......这种方法非常有效。通过使用对bean的引用,您无需链接初始化。该方法将始终依赖于其他bean中的方法,从而保证初始化的顺序。

有多种方法可以访问bean,但我通常会通过EL路径 - >

Get JSF managed bean by name in any Servlet related class

祝你好运,我尽力保持“功能纯洁” - 我希望考虑到这种语言会让人大笑!

答案 2 :(得分:0)

对于你来说,这是一个很酷的hax,以防其他解决方案因各种情况而无法为你工作......

假设我有一个我想要首先初始化的课程Atom : 1.26.1 Electron: 1.7.11 Chrome : 58.0.3029.110 Node : 7.9.0

Alpha

我可以在public class Alpha { @PostConstruct public void init() { } } 中添加以下方法:

Alpha

然后,在任何过早初始化的类中,只需调用:

@ManagedBean(name = "Alpha", eager = true)
public class Alpha {
    public static void requireAlpha() {
        FacesContext context = FacesContext.getCurrentInstance();
        Object alpha = context.getApplication().evaluateExpressionGet(context, "#{Alpha}", Object.class);
        System.out.println("Alpha required: " + alpha.toString());
    }

    @PostConstruct
    public void init() {

    }
}

如果有Alpha.requireAlpha(); // ... // (Code that requires Alpha to be initialized first.) 类扩展ChildAlpha你真正想要初始化(而不是父类),请确保在{{1}中使用“ChildAlpha”和EL表达式(Alpha)。

有关更多信息,请参阅此处:enter image description here