[英]Weld CDI : Using @Alternative @Singleton
我有一个用@Singleton
注释的Producers类,包含一个用@Produces
注释的方法。
我想使用此方法的替代方法编写单元测试,但无法设法执行此操作。 这是我的代码的摘要:
package fr.easycompany.easywrite.tools.injection;
@Singleton
public class Producers {
@Produces @Named(PREFERENCES_FILE_NAMED)
public String producePreferenceFileName(){
return "preferences.xml";
}
}
而我的选择:
package fr.easycompany.easywrite.tools.injection;
@Singleton
@Alternative
public class ProducersAlternative {
@Produces @Named(PREFERENCES_FILE_NAMED)
public String producePreferenceFileName(){
return "preferences_test.xml";
}
}
我还在src / test / resources / META-INF中创建了一个beans.xml,其中包含以下内容
<?xml version="1.0" encoding="UTF-8"?>
<beans xmlns="http://java.sun.com/xml/ns/javaee"
xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance"
xmlns:weld="http://jboss.org/schema/weld/beans"
xsi:schemaLocation="
http://java.sun.com/xml/ns/javaee http://docs.jboss.org/cdi/beans_1_0.xsd
http://jboss.org/schema/weld/beans http://jboss.org/schema/weld/beans_1_1.xsd">
<alternatives>
<class>fr.easycompany.easywrite.tools.injection.ProducersAlternative</class>
</alternatives>
</beans>
在执行时,它总是被调用的Producers#producePreferenceFileName()
。 为什么不是ProducersAlternative
的方法? 是否不可能选择单例注入类?
我不认为这与单身人士有任何关系。 @Alternative注释不是要在Producer类上使用,而是在bean的替代实现上使用。 您可以使用替代构造型并注释替代生成器方法,以使其工作。 这是必需的,因为在beam.xml中无法启用具有@Alternative注释的方法 - 但是构造型可以(参见JBoss论坛上的讨论 )。 为此,您必须创建一个这样的构造型:
@RequestScoped
@Stereotype
@Retention(RetentionPolicy.RUNTIME)
@Alternative
@Target({
ElementType.TYPE, ElementType.METHOD
})
public @interface Staging {}
你必须在beans.xml中启用这个替代构造型(而不是在那里声明你的替代生成器类),如下所示:
<alternatives>
<stereotype>full.qualified.path.to.Staging</stereotype>
</alternatives>
然后,您可以注释替代生成器方法(最好删除生产者类和beans.xml中的@Alternative注释):
@Singleton
public class ProducersAlternative {
@Produces @Named(PREFERENCES_FILE_NAMED) @Staging
public String producePreferenceFileName(){
return "preferences_test.xml";
}
}
希望这可以帮助 :-)
声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.