在JSF2.2自定义组件中获取应用程序范围的bean
我正在开发一个新的JSF2.2应用程序 我急切地创建了一个应用程序范围管理的bean,它在启动时从外部文件加载一些配置数据,并将其存储为状态 我有一个静态工作的在JSF2.2自定义组件中获取应用程序范围的bean,jsf,jsf-2,jsf-2.2,custom-component,managed-bean,Jsf,Jsf 2,Jsf 2.2,Custom Component,Managed Bean,我正在开发一个新的JSF2.2应用程序 我急切地创建了一个应用程序范围管理的bean,它在启动时从外部文件加载一些配置数据,并将其存储为状态 我有一个静态工作的FacesComponent和facesrender 我希望能够将存储在托管bean中的配置数据获取到FacesComponent中。有没有一个标准的方法来做到这一点 据我所知,托管bean不能注入组件中-对吗 我可以尝试使用使用自定义组件的.xhtml文件中的属性和el将数据获取到自定义组件中,例如 <my:customCompo
FacesComponent
和facesrender
我希望能够将存储在托管bean中的配置数据获取到FacesComponent中。有没有一个标准的方法来做到这一点
据我所知,托管bean不能注入组件中-对吗
我可以尝试使用使用自定义组件的.xhtml文件中的属性和el将数据获取到自定义组件中,例如
<my:customComponent data="#{managedBean.loadedData}"/>
持有者是另一个应用程序范围的bean
@Named
@ApplicationScope
public class Holder {...}
加载数据时,Holder实例被正确地注入到加载程序中
然而,当我看到以下情况时
@Named //Makes no difference if this is here or not
@FacesComponent(value="family", createTag=true, namespace="...namespace...", tagName="tag")
public class Component extends UIComponentBase {
@Inject
public class Holder holder;
@Override
public void encodeBegin(FacesContext context) {
holder.getData();
}
}
当组件开始渲染时,不会注入持有者,我得到一个空指针异常。我已经尝试过在没有@Named注释的情况下使用我们的方法来实现这一点,并且得到了相同的结果
我做错什么了吗?请您提供建议。应用程序范围的JSF托管bean在应用程序映射中内部存储,托管bean名称作为密钥 因此,任何
UIComponent
方法中的以下内容都应该:
ManagedBean managedBean = (ManagedBean) getFacesContext().getExternalContext()
.getApplicationMap().get("managedBean");
// ...
这只会使组件与托管bean紧密耦合。也就是说,没有托管bean,组件就不可能存在。如果该组件打算在其他Web应用程序中重用,则应清楚地记录这一点。另一种选择是将托管bean专门绑定到组件(可能以复合组件的形式),并将另一个应用程序范围的bean用于“不相关”的应用程序数据 澄清:我所说的“静态工作”是指组件使用固定数据。我正在尝试使用启动时加载的配置使其动态化。谢谢-我明天会尝试,并让您知道我的结果。Hi@BalusC,您有机会查看我对该问题的更新吗?抱歉,我混淆了版本。它原定于JSF2.2,但在最后一刻被取消,并被重新安排为JSF2.3。
ManagedBean managedBean = (ManagedBean) getFacesContext().getExternalContext()
.getApplicationMap().get("managedBean");
// ...