[英]Getting application scoped bean in JSF 2.2 custom component
我正在开发一个新的JSF 2.2应用程序。
我有一个热切创建的,应用程序范围托管的bean,该bean在启动时从外部文件加载一些配置数据,并将其存储为状态。
我有一个静态工作的FacesComponent
和FacesRenderer
。
我希望能够将存储在托管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.