首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >在Java上焊接不使用替代

在Java上焊接不使用替代
EN

Stack Overflow用户
提问于 2015-12-01 11:53:48
回答 2查看 1.2K关注 0票数 1

我有projectAprojectBprojectC 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
    • 初始化Weld SE并检索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.最后:

代码语言:javascript
复制
<dependency>
    <groupId>org.jboss.weld.se</groupId>
    <artifactId>weld-se</artifactId>
    <version>2.2.10.Final</version>
    <scope>runtime</scope>
</dependency>

初始化过程很简单

代码语言:javascript
复制
WeldContainer weld =
  new Weld().
    initialize();
IMyApi myApi =
  weld.
    instance().
    select(
      IMyApi.
        class).
    get();
EN

回答 2

Stack Overflow用户

回答已采纳

发布于 2015-12-01 17:42:24

alternatives描述符中使用beans.xml元素选择替代文件只会影响对应的bean存档,即在您的示例中是ProjectC,如声明bean存档的选定替代方案中所描述的那样。基于这一点,ProjectB bean归档获得注入的MyConfigJndi实现是合乎逻辑的。

从CDI1.2开始,就可以使用@Priority注释(如声明应用程序的选定替代方案中所记录的那样)为应用程序选择一个全局替代方案。

所以在你的例子中,你可以写:

代码语言:javascript
复制
@Priority(Interceptor.Priority.Application)
@Alternative
class MyConfigAlter {
}
票数 4
EN

Stack Overflow用户

发布于 2015-12-02 12:28:06

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

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

票数 0
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/34019820

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档