繁体   English   中英

在JSF 2.2定制组件中获取应用程序范围的Bean

[英]Getting application scoped bean in JSF 2.2 custom component

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

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

我有一个静态工作的FacesComponentFacesRenderer

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

据我所知,不能将托管bean注入组件中-是吗?

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

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

但这似乎是一种倒退的处理方式,并且实际上向组件用户公开了组件的内部实现。

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

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

我有一个加载器,将加载的数据放入一个holder对象

@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托管Bean以托管Bean名称作为键在内部存储在应用程序映射中。

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

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

这仅使组件紧密耦合到托管bean。 也就是说,如果没有托管bean,该组件将不存在。 如果打算将该组件在其他Web应用程序中重用,则应对此进行明确记录。 另一个选择是将受管bean专门绑定到组件(也许以复合组件的形式),然后将另一个应用程序作用域bean用于“不相关的”应用程序数据。

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM