我为每个用户提供了一个导航托管 bean。
我需要它在任何其他bean之前先初始化,因为bean需要一个值。
我可以知道我该怎么做吗?
我已经尝试过eager="true"
,但它不起作用。
任何通过 faceconfig 快速简便的解决方案将不胜感激。
我为每个用户提供了一个导航托管 bean。
我需要它在任何其他bean之前先初始化,因为bean需要一个值。
我可以知道我该怎么做吗?
我已经尝试过eager="true"
,但它不起作用。
任何通过 faceconfig 快速简便的解决方案将不胜感激。
只需在 bean 的@PostConstruct
.
@PostConstruct
public void init() {
// Here.
}
当 bean 第一次从另一个 bean 注入/引用时,它将被调用。
仅适用于应用程序范围的eager=true
bean。
从我看到的你应该引用另一个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
祝你好运,我尽量保持“功能上的纯正”——我希望考虑到这种语言,我会发笑!
这里有一些很酷的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