3

我为每个用户提供了一个导航托管 bean。

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

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

我已经尝试过eager="true",但它不起作用。

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

4

3 回答 3

2

只需在 bean 的@PostConstruct.

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

当 bean 第一次从另一个 bean 注入/引用时,它将被调用。

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

于 2012-09-07T11:17:43.377 回答
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 路由 ->

在任何 Servlet 相关类中按名称获取 JSF 托管 bean

祝你好运,我尽量保持“功能上的纯正”——我希望考虑到这种语言,我会发笑!

于 2012-09-07T02:57:54.127 回答
0

这里有一些很酷的hax,以防其他解决方案由于各种情况对你不起作用......

假设我有一个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扩展的类Alpha是您真正想要初始化的(而不是父类),请确保在name=""和 EL 表达式 ( "#{}") 中都使用“ChildAlpha”。

有关更多信息,请参见此处:在任何 Servlet 相关类中按名称获取 JSF 托管 bean

于 2018-05-03T15:28:58.957 回答