簡體   English   中英

焊接CDI:使用@Alternative @Singleton

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM