【问题标题】:Getting application scoped bean in JSF 2.2 custom component在 JSF 2.2 自定义组件中获取应用程序范围的 bean
【发布时间】:2015-07-05 09:08:58
【问题描述】:

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

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

我有一个 FacesComponentFacesRenderer 静态工作。

我希望能够将托管 bean 中存储的配置数据获取到 FacesComponent。有没有标准的方法来做到这一点。

据我所知,托管 bean 无法注入到组件中 - 对吗?

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

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

但这似乎是一种非常倒退的做事方式,实际上向组件用户公开了组件的内部实现。

如果有其他方法,或者您需要更多信息,请告诉我。

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

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

@Named
@ApplicationScoped
public class Loader implements Serializable {

    @Inject
    private Holder holder

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

}

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

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

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

但是当我他们以下时

@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 jsf-2 jsf-2.2 custom-component managed-bean


【解决方案1】:

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

因此,任何UIComponent 方法中的以下内容都应该这样做:

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

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

【讨论】:

  • 谢谢 - 我明天试试这个,然后告诉你我的结果
  • 嗨@BalusC,你有机会看看我对这个问题的更新吗?
  • 对不起,我混淆了版本。它原计划用于 JSF 2.2,但在最后一刻被取消并重新计划用于 JSF 2.3。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2016-12-25
  • 2015-11-14
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2015-09-06
  • 2012-11-13
相关资源
最近更新 更多