Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
在JSF2.2自定义组件中获取应用程序范围的bean_Jsf_Jsf 2_Jsf 2.2_Custom Component_Managed Bean - Fatal编程技术网

在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

我正在开发一个新的JSF2.2应用程序

我急切地创建了一个应用程序范围管理的bean,它在启动时从外部文件加载一些配置数据,并将其存储为状态

我有一个静态工作的
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");
// ...