Jsf 2 将资源注入UIComponent(也就是CDI在这里工作吗?)
我正在编写一个需要与DAO交互的复合组件。以下是Java部件的声明方式:Jsf 2 将资源注入UIComponent(也就是CDI在这里工作吗?),jsf-2,cdi,composite-component,Jsf 2,Cdi,Composite Component,我正在编写一个需要与DAO交互的复合组件。以下是Java部件的声明方式: @FacesComponent(value="selectLocation") public class SelectLocation extends UINamingContainer { 为了获得DAO对象,我尝试了CDI注释: @Inject private LocationControl lc; @ManagedProperty (value = "@{locationControl}") pr
@FacesComponent(value="selectLocation")
public class SelectLocation extends UINamingContainer {
为了获得DAO对象,我尝试了CDI注释:
@Inject private LocationControl lc;
@ManagedProperty (value = "@{locationControl}") private LocationControl lc;
但这不起作用,所以我尝试了Faces注释:
@Inject private LocationControl lc;
@ManagedProperty (value = "@{locationControl}") private LocationControl lc;
这两种情况都不会发生任何事情-构造函数完成后,属性lc最终为null
我在我所有的支持bean中都使用了CDI,而且一切正常。这将在GlassFish 3.1.1中使用焊接。关于如何获取资源有什么建议吗?我现在有一个解决办法,就是基本上把CDI等人应该删除的锅炉板代码放进去。我现在有了这个方法:
public LocationControl getLocationControl() {
if (lc != null) return lc;
FacesContext fc = getFacesContext();
Object obj = fc.getApplication().evaluateExpressionGet(fc, "#{locationControl}", LocationControl.class);
if (obj instanceof LocationControl) lc = (LocationControl) obj;
return lc;
}
我想知道是否有人有更好的解决方案。我不知道它是否也适用于组件,但使用CDI+MyFaces CODI,您可以使用@Advanced标记,例如,相位监听器,它应该能够使用@Inject。如果不起作用,您可以在他们的JIRA中创建一个功能请求。它们速度非常快,而且经常发布 或者您使用: MyBean MyBean=BeanManagerProvider.getInstance.getContextualReferenceMyBean.class; 手动 有没有一种方法可以在没有变通办法的情况下完成这项工作 是的,只需按照通常的方式使用支持bean
<x:someComponent value="#{someBean.someProperty}" />
如有必要,将其包裹在可重复使用的标记文件/复合材料中,以保持干燥:
<my:someComponent />
Dang我还以为你在做什么-我尝试了java.inject.Named,但仍然没有乐趣。添加@RequestScoped会导致应用程序无法部署:WELD-001437普通作用域bean类javax.faces.component.UIComponent不可代理,因为类型是final或它包含final方法public finaljavax.faces.component.TransientStateHelper javax.faces.component.UIComponent.getTransientStateHelper。创建的组件允许用户通过浏览此类对象的数据库JPA来选择位置对象。为此,我需要直接或间接地访问DAO。但是我的DAO与我的其他CDI托管bean没有什么不同——它们只是在内部有JPA注释,比如@PersistenceContext。我现在正在阅读CDI规范,看看beans.xml中是否有什么东西可以提供帮助。