当前位置: 首页 > 知识库问答 >
问题:

CDI(Weld SE)在使用Producer方法时不注入内部依赖项

鲁才艺
2023-03-14

我在一个独立的java项目中使用WELD SE,在我开始使用producers之前,它似乎工作得很好。

生产者方法是有效的——容器使用它,但从不注入产生的bean的内部依赖关系。当我删除生产者时,它正常工作。即使在规范和谷歌上搜索了很长时间,我也找不到原因。

制作人的例子:

@ApplicationScoped
public class LaminaValidadorProducer {

    private static final String XSD_PATH = getConfig("processador.xsd.path");
    private static final Map<VersaoLamina,String> XSD_PER_VERSION = new HashMap<>();
    static {
        XSD_PER_VERSION.put(VersaoLamina.V1, getConfig("processador.lamina.xsd.file"));
        XSD_PER_VERSION.put(VersaoLamina.V2, getConfig("processador.laminav2.xsd.file"));        
    }

    @Produces
    public LaminaValidador buildValidador() {
        return new LaminaValidador(XSD_PATH, XSD_PER_VERSION);
    }
}

LaminavalidOr正常注入,但其内部属性(标记为@Inject)未被注入。这个项目有很多优点。带有bean discovery mode=“all”的xml。

有什么线索吗?

共有1个答案

云宝
2023-03-14

这不仅是SE的问题,事实上也是CDI的期望/预期行为。

这背后的原因是,通常情况下,如果您没有生产者,CDI会为您创建bean类(通过调用no args构造函数或带有注入的构造函数),然后解析bean中的注入点(并执行其他一些操作,请参见规范)。例如,您将生命周期管理留给CDI容器。

另一方面,使用生产者通常是从类中创建bean的一种方法,其中:

  • 你不能自己控制生命周期,例如EntityManager
  • 您与其他框架集成,它们具有复杂的初始化
  • 在调用某些构造函数之前,需要对外部配置进行一些检查
  • 或者您可能需要一个bean作为基本类型(int)
  • 以及更多的用例

现在,这意味着您负责创建bean。这包括其中的任何字段。容器只是将生产者作为创建完整bean的一种方式,并假设您已经注意或初始化需要什么。

现在,根据你的问题,我判断你需要注射点的分辨率。由于CDI的静态性质(以及其他更复杂的原因),没有简单的方法(如果有的话)手动“强制”解决方案。因此,我建议使用一种不同的方法,利用构造函数注入或初始化方法?如果你能提供更多信息,我也许能帮上忙。

 类似资料:
  • 然而,Eclipse告诉我“没有bean可以被注入到注入点[JSR-299§5.2.1]”。我做错了什么?你有没有看到我缺少的东西。如有任何帮助,我们将不胜感激。 谢谢!!

  • 我正在通过添加CDI重构旧模块。 我以 和 为了进行测试,我创建了一个文件: 为了测试它,我正在做这个博客中显示的 和 现在,当我试图测试逻辑时,我做到了 当我运行它时,两个测试属性都是inject,但是我得到了NPE,因为实例中的属性没有被赋值。 为什么Weld不能识别中的属性? JDK 7,焊接2.2.10,Junit 4.12 更新:发布问题后,开始尝试一个更简单、全新的项目(只有两个接口和

  • 我有一个叫做Container的类: ServiceB依赖于ServiceA: 在我的应用程序中可以有几个容器。现在,有没有什么诀窍可以将这个已经被注入到与ServiceB相同的容器实例中的ServiceA实例注入到ServiceB中呢?

  • 问题内容: 尝试为模块设置一些辅助值。尝试了服务和价值,但没有帮助: 我做错了什么? 问题答案: 问题是您试图将值对象插入AngularJS模块的config块中,并且不允许这样做。您只能在config块中注入常量和提供程序。 AngularJS 文档(部分:“模块加载和依赖关系”)提供了有关以下方面的见解: 模块是配置和运行块的集合,这些块在引导过程中应用于应用程序。以最简单的形式,该模块包含两

  • 我正在junit测试中使用Weld SE。它似乎没有注入CDIBean的内部场。我使用的是maven artifcat 没有例外,该字段只是空的。我尝试了构造函数注入,而不是字段注入: 在这种情况下,我会收到一条异常消息:org。jboss。焊接例外。不满意的解决方案例外:WELD-001334:带限定符的Z型服务的不满意依赖项

  • 我得到以下生成错误: 错误:[dagger.android.androidinjector.inject(T)]没有@provides-annotated方法,无法提供android.support.v4.app.fragmentManager。 公共抽象接口AppComponent扩展dagger.android.androidinjector{^android.support.v4.app.f