我有Project A
,Project B
和Project C
Eclipse Maven项目。
ProjectA
包含:IMyConfig
接口。MyConfigJndi
IMyConfig的实现。MyApiImpl
实现IMyApi
,具有属性@Inject私有IMyConfig config;
。 META-INF\beans.xml
文件。MyConfigAlter
的IMyConfig
实现,标记为@替代
。 Main
类(和方法),初始化Weld SE并检索一个IMyApi
bean。META-INF\beans.xml
,其中MyConfigAlter
在替换
部分中列出。现在,我运行Main
类,并且成功地检索了IMyApi
bean(作为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();
另一种解决方法是使用-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提供唯一的类加载器。
使用bean中的
描述符只影响相应的bean归档,即在您的情况下,alternations
元素选择替代方案。xmlProjectC
,如声明bean归档的选定替代方案中所述。基于此,ProjectB
bean归档文件注入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