Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/jsf-2/2.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Jsf 2 将资源注入UIComponent(也就是CDI在这里工作吗?)_Jsf 2_Cdi_Composite Component - Fatal编程技术网

Jsf 2 将资源注入UIComponent(也就是CDI在这里工作吗?)

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

我正在编写一个需要与DAO交互的复合组件。以下是Java部件的声明方式:

@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中是否有什么东西可以提供帮助。