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

焊接在JavaSE不使用替代

赖明煦
2023-03-14

我有Project AProject BProject CEclipse Maven项目。

  • ProjectA包含:
  • IMyConfig接口。
  • MyConfigJndiIMyConfig的实现。
  • MyApiImpl实现IMyApi,具有属性@Inject私有IMyConfig config;
  • "空"META-INF\beans.xml文件。
  • 一个MyConfigAlterIMyConfig实现,标记为@替代
  • 一个Main类(和方法),初始化Weld SE并检索一个IMyApibean。
  • 一个META-INF\beans.xml,其中MyConfigAlter替换部分中列出。

现在,我运行Main类,并且成功地检索了IMyApibean(作为MyApiImpl实例)。但是这样的实例在其config属性中被注入了MyConfigJndi实例,而不是替代版本(MyConfigAlter

我正在使用Eclipse Luna M2Eclipse。

我做错了什么?

更新:我发现使用@专业而不是@替代解决了这个问题,但我仍然认为这不是正确的解决方案(在某些情况下,我可能无法访问默认实现)。

更新2:

我使用的是Weld se,2.2.10。最终:

<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.10.Final</version>
    <scope>runtime</scope>
</dependency>

初始化过程非常简单

WeldContainer weld =
  new Weld().
    initialize();
IMyApi myApi =
  weld.
    instance().
    select(
      IMyApi.
        class).
    get();

共有2个答案

岳浩宕
2023-03-14

另一种解决方法是使用-Dorg。jboss。焊接东南方。档案文件隔离=假-来自http://docs.jboss.org/weld/reference/2.2.11.Final/en-US/html/environments.html#_bean_archive_isolation_2

发生这种情况的原因是类路径上的每个JAR都变成了自己的bean存档。由于1.2版本的CDI规范不包括SE规范,因此没有定义类路径在这种模式下如何操作。这不一定是SE应用的设计方式,因为您没有为每个JAR提供唯一的类加载器。

班思源
2023-03-14

使用bean中的alternations元素选择替代方案。xml描述符只影响相应的bean归档,即在您的情况下,ProjectC,如声明bean归档的选定替代方案中所述。基于此,ProjectBbean归档文件注入MyConfigJndi实现是合乎逻辑的。

自CDI 1.2以来,可以使用@Priority注释为应用程序全局选择备选方案,如声明应用程序的选定备选方案中所述。

所以在你的情况下,你可以写:

@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}
 类似资料:
  • 我试图在JavaSE中建立一个非常简单的weld实现。 我有扩展类: 然后,我有一个简单的类,我想注入: 最后,我想把它注入课堂: 结果是: 我希望在构造Test()时注入简单类,并调用postconstruct方法,该方法应输出预期文本。 我到底做错了什么?

  • 我正在学习jboss Weld Event教程中的Weld Event,我想写一个观察事件并在事件被激发时打印helloword的示例。 这是我的代码: 它不起作用,给出以下异常信息: 容器中似乎没有可以初始化的bean 那么我该怎么做才能使它运行,我的beans.xml是空的 也许我应该在beans.xml中做些什么? 或者我应该编写一个实现事件接口的Java类? 任何内容都将适用。

  • 我有一个基于Java EE6CDI的应用程序,运行在JBoss 7.1.1版本上,它也包含一些会话bean。 }

  • 我试图提供一个机会注入任意枚举给定的注入点和字符串值(这是在生产方法中获得) 任意是指如果我有枚举我的和枚举你的,我想用相同的生产者方法注入它们两个或任何其他一个。 所以我尝试了几种方法:1。 2.我将返回类型更改为对象。 在这两种情况下,我都会收到由:org引起的下一个异常。jboss。焊接例外情况。DeploymentException:WELD-001408:在注入点[BackedAnnot

  • 像这样上课: 有没有可能告诉Weld不要注射到c中?我可以否决使用事件的类: 但是B物体也不会被注射。我在搜索类似这样的东西:“如果类名是A,字段类型是C,那么省略注入。” 更具体地说,我希望HK2引擎注入“C”字段,问题是HK2和焊接都使用@注入注释。 我尝试了西利亚罗斯的解决方案。我找到了想要添加自定义注入实现的类型,比如: 在我添加了覆盖注入(…)在美国 比如: 在Manager eBVia