在JSF 2.2自定义组件中获取应用程序作用域bean

时间:2015-07-05 09:08:58

标签: jsf jsf-2 jsf-2.2 custom-component managed-bean

我正在开发一个新的JSF 2.2应用程序。

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

我有一个静态工作的#1 .1 { //css code } #2 .2{ //css code } FacesComponent

我希望能够将托管bean中存储的配置数据导入FacesComponent。有没有一种标准的方法可以做到这一点。

据我所知,托管bean无法注入组件 - 这是正确的吗?

我可以尝试使用自定义组件的.xhtml文件中的attributes和el将数据导入自定义组件,例如

FacesRenderer

但这似乎是一种非常倒退的方式,并且实际上将组件的内部实现暴露给组件用户。

如果您有其他方式,或者您需要更多信息,请与我们联系。

更新:@BalsusC我已经尝试了你的建议

我有一个加载器,可以将加载的数据放入持有者对象

<my:customComponent data="#{managedBean.loadedData}"/> 

持有者是另一个应用程序范围的bean

@Named
@ApplicationScoped
public class Loader implements Serializable {

    @Inject
    private Holder holder

    @PostConstruct
    public void init() {
        // Load data into the holder here
    }

}

加载数据时,Holder实例正确注入Loader。

然而,当我他们以下

@Named
@ApplicationScope
public class Holder {...}

当组件进行渲染时,不会注入持有者,并且我得到一个空指针异常。我试图在没有@Named注释的情况下使用相同的结果进行此操作。

我做错了吗?能告诉你吗。

1 个答案:

答案 0 :(得分:2)

应用程序范围的JSF托管bean内部存储在应用程序映射中,托管bean名称为密钥。

因此,UIComponent方法中的任何一个方法都应该这样做:

ManagedBean managedBean = (ManagedBean) getFacesContext().getExternalContext()
    .getApplicationMap().get("managedBean");
// ...

这只会使组件与托管bean紧密耦合。即没有托管bean,组件不能存在。如果组件有意在其他Web应用程序中重用,则应明确记录此信息。另一种选择是将托管bean专门绑定到组件(可能以复合组件的形式),并将另一个应用程序范围的bean用于“不相关的”应用程序数据。