我正在开发一个新的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注释的情况下使用相同的结果进行此操作。
我做错了吗?能告诉你吗。
答案 0 :(得分:2)
应用程序范围的JSF托管bean内部存储在应用程序映射中,托管bean名称为密钥。
因此,UIComponent
方法中的任何一个方法都应该这样做:
ManagedBean managedBean = (ManagedBean) getFacesContext().getExternalContext()
.getApplicationMap().get("managedBean");
// ...
这只会使组件与托管bean紧密耦合。即没有托管bean,组件不能存在。如果组件有意在其他Web应用程序中重用,则应明确记录此信息。另一种选择是将托管bean专门绑定到组件(可能以复合组件的形式),并将另一个应用程序范围的bean用于“不相关的”应用程序数据。