使用@ApplicationScoped @Named @Eager,my @EJB-injected @Statelessbean没有正确实例化并进行评估null.
我有一个@ApplicationScoped @ManagedBean(eager=true)习惯于安排一些工作的人.一些@Statelessbean使用@EJB注释注入,并且工作正常.
在转向CDI注释时,我添加了OmniFaces@Eager注释作为@ManagedBean(eager=true)标准CDI中缺少的注释:
import javax.annotation.PostConstruct;
import javax.annotation.PreDestroy;
import javax.ejb.EJB;
import javax.enterprise.context.ApplicationScoped;
import javax.inject.Inject;
import javax.inject.Named;
import org.omnifaces.cdi.Eager;
@Named
@ApplicationScoped
@Eager
public class MyScheduler implements Serializable {
@EJB
private MyService myService;
@Inject
private MyNamedBean myNamedBean;
@PostConstruct
public void init() {
setupSchedulers();
}
@PreDestroy
public void destroy() {
destroySchedulers();
}
//...
}
Run Code Online (Sandbox Code Playgroud)
使用此设置,@PostConstruct在应用程序启动时正确调用该方法(尽管它似乎甚至在初始化上下文之前运行),但随后myService进行求值null.
在日志中,将显示以下警告: …
根据https://code.google.com/p/primefaces/issues/detail?id=4720,ComponentUtils.resolveWidgetVar(String expression, UIComponent component)自2013年以来,该功能在Primefaces中可用.它可以通过该"#{p:widgetVarFromContext(searchExpression, component)}"功能在EL中使用.
这在多个组件具有相同ID NamingContainer但不同但仍存在于同一视图中的情况下非常有用.在这种情况下,该#{p:widgetVar(searchExpression)}函数仅返回找到的最后一个函数.
我不明白如何引用UIComponent必须作为EL的第二个参数传递.上面提到的错误报告表明我们可以使用它来引用它#{component}.任何人都可以提供一个例子吗?