焊接CDI:使用@Alternative @Singleton

时间:2013-05-17 13:54:12

标签: java jboss-weld

我有一个使用@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中创建了一个带有以下内容的bean.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的方法?是否不可能选择单例注入类?

1 个答案:

答案 0 :(得分:2)

我认为这与单身人士没有任何关系。 @Alternative注释不是要在Producer类上使用,而是在bean的替代实现上使用。您可以使用替代构造型并注释替代生成器方法,以使其工作。这是必需的,因为在beam.xml中无法启用具有@Alternative注释的方法 - 但是构造型可以(参见this discussion on JBoss forum)。要做到这一点,你必须创建一个这样的刻板印象:

@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";
  }
}

希望这会有所帮助: - )