我有projectA、projectB和projectC Eclipse项目。
ProjectA包含:IMyApi接口META-INF\beans.xml文件。
ProjectB包含:IMyConfig接口MyConfigJndi IMyConfig的实现。MyApiImpl实现IMyApi,带有属性@Inject private IMyConfig config;。META-INF\beans.xml文件。
ProjectC包含:MyConfigAlter实现的IMyConfig,标记为@Alternative。IMyApi bean的一个IMyApi类(和方法)。META-INF\beans.xml,其中MyConfigAlter列在alternatives部分中。
现在,我运行Main类,成功地检索到IMyApi bean (作为MyApiImpl实例)。但是这种实例在其config属性中被注入了一个MyConfigJndi实例,而不是替代版本(MyConfigAlter)。
我用的是Eclipse露娜+ M2Eclipse。
我做错了什么?
更新:我发现使用@Specializes而不是@Alternative解决了这个问题,但我仍然认为这不是正确的解决方案(在某些情况下,我可能无法访问“默认”实现)。
更新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();发布于 2015-12-01 17:42:24
在alternatives描述符中使用beans.xml元素选择替代文件只会影响对应的bean存档,即在您的示例中是ProjectC,如声明bean存档的选定替代方案中所描述的那样。基于这一点,ProjectB bean归档获得注入的MyConfigJndi实现是合乎逻辑的。
从CDI1.2开始,就可以使用@Priority注释(如声明应用程序的选定替代方案中所记录的那样)为应用程序选择一个全局替代方案。
所以在你的例子中,你可以写:
@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}发布于 2015-12-02 12:28:06
解决这一问题的另一种方法是使用-Dorg.jboss.weld.se.archive.isolation=false - from 2
发生这种情况的原因是类路径上的每个JAR成为自己的bean存档。由于CDI规范(从1.2开始)不包括SE规范,因此没有定义类路径在这种模式下的工作方式。这并不一定是SE应用程序的设计方式,因为每个JAR都没有独特的类加载器。
https://stackoverflow.com/questions/34019820
复制相似问题