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并检索
bean的IMyApi
类(和方法)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。