Java SE上的Weld不使用替代方案

Java SE上的Weld不使用替代方案,java,cdi,weld,weld-se,Java,Cdi,Weld,Weld Se,我有projectA、projectB和projectCeclipsemaven项目 ProjectA包含: IMyApi接口 “Empty”META-INF\beans.xml文件 ProjectB包含: IMyConfig接口 MyConfigJndi实现IMyConfig myapimpl实现IMyApi,带有属性@injectprivate-IMyConfig-config “Empty”META-INF\beans.xml文件 ProjectC包含: myConfigGal

我有
projectA
projectB
projectC
eclipsemaven项目

  • ProjectA
    包含:
    • IMyApi
      接口
    • “Empty”
      META-INF\beans.xml
      文件
  • ProjectB
    包含:
    • IMyConfig
      接口
    • MyConfigJndi
      实现
      IMyConfig
    • myapimpl
      实现
      IMyApi
      ,带有属性
      @injectprivate-IMyConfig-config
    • “Empty”
      META-INF\beans.xml
      文件
  • ProjectC
    包含:
    • myConfigGalter
      实现
      IMyConfig
      ,标记为
      @Alternative
    • 初始化Weld SE并检索
      IMyApi
      bean的
      Main
      类(和方法)
    • META-INF\beans.xml
      中的
      myConfigGalter
      列在
      备选方案
      部分
现在,我运行
Main
类,成功地检索到
IMyApi
bean(作为
myapimpl
实例)。但是这样的实例在其
config
属性中被注入了
MyConfigJndi
实例,而不是替代版本(
MyConfigAlter

我正在使用EclipseLuna+M2Eclipse

我做错了什么

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

更新2:

我使用的是焊接se,2.2.10.Final:

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

使用
beans.xml
描述符中的
alternations
元素选择一个备选方案只会影响相应的bean归档,即您的案例中的
ProjectC
,如中所述。基于此,
ProjectB
bean归档将
MyConfigJndi
实现注入是合乎逻辑的

自CDI 1.2以来,可以使用中记录的
@Priority
注释为应用程序全局选择备选方案

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

@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}

使用
beans.xml
描述符中的
alternations
元素选择一个备选方案只会影响相应的bean归档,即您的案例中的
ProjectC
,如中所述。基于此,
ProjectB
bean归档将
MyConfigJndi
实现注入是合乎逻辑的

自CDI 1.2以来,可以使用中记录的
@Priority
注释为应用程序全局选择备选方案

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

@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}

另一种解决方法是使用
-Dorg.jboss.weld.se.archive.isolation=false
-from


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

另一种解决方法是使用
-Dorg.jboss.weld.SE.archive.isolation=false
-from


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

您能提供一些信息吗,比如您使用的是什么版本的weld,如何引导?这个事实听起来很奇怪。@JohnAment谢谢你的兴趣,我添加了请求的数据。在你上面提到的三个jar中,初始化代码住在哪一个?@JohnAment在
ProjectC
中,在
main
类的
main
方法中。你能提供一些信息吗,比如你使用的是什么版本的weld,你是如何引导的?这个事实听起来很奇怪。@JohnAment感谢您的关注,我添加了请求的数据。在您上面提到的三个jar中,初始化代码位于
ProjectC
中的
main
类的
main
方法中的@JohnAment。