2017-03-24 60 views
0

我們正在嘗試在部署在Wildfly 10.1.0服務器上的集成測試套件中使用替代bean實例注入。@Specializes in Wildfly 10.1.0

根據CDI 1.2規範,可能的解決方案是僅對集成測試歸檔中部署的替代方案使用@Specializes註釋。

但是,默認實現總是被注入。我們嘗試了對受管Bean,會話bean的@Specializes,並嘗試在beans.xml文件中選擇備選項。

下面的示例說明這個問題:

BeanInterface.java

public interface BeanInterface { 
    void work(); 
} 

Implementation1.java

@Dependent 
public class Implementation1 implements BeanInterface { 
    @Override 
    public void work() { 
     System.out.println("test 1"); 
    } 
} 

Implementation2

@Dependent 
@Alternative 
@Specializes 
public class Implementation2 extends Implementation1 { 
    @Override 
    public void work() { 
     System.out.println("test 2"); 
    } 
} 

TestSingleton.java :

@Singleton 
@Startup 
public class TestSingleton { 

    @Inject 
    private BeanInterface beanInterface; 

    @PostConstruct 
    public void init() { 
     this.beanInterface.work(); 
    } 
} 

包裝這些類中一戰(有一個web.xml)和wildfly部署上,實施1中的無狀態豆總是注入。

Wildfly 10.1.0使用了實現CDI 1.2的weld-2.3.SP2。

感謝,

查理

+0

您是否在beans.xml中聲明瞭bean作爲替代方案?你把它放在哪裏?在webapp/WEB-INF中?你需要什麼web.xml? – Rouliboy

+0

另外,所有這些都直接部署到WAR中,還是有任何內部庫JAR參與?作爲說明,您可以通過'@ Priority'自動激活備選方案 –

+0

謝謝John - 在Implementation2上使用@Priority按預期工作。我們在某種程度上試圖沒有成功,可能還有別的。 Rouliboy:我的意思是beans.xml,web.xml。 beans.xml爲空,使用bean-discovery-mode =「all」。 – cghislai

回答

0

雖然它沒有如預期的那樣@Specializes註釋工作,該解決方案由約翰·柔夷花序建議允許注射第二次執行。

只需更改爲@ javax.annotation.Priority的@ javax.enterprise.inject.Specializes註解(和一些值):

@Dependent 
@Alternative 
@Priority(100) 
public class Implementation2 extends Implementation1 { 
    @Override 
    public void work() { 
     System.out.println("test 2"); 
    } 
} 

在OP問題也不翼而飛是在beans.xml中(而不是web .xml)打包在WEB-INF中:

<?xml version="1.0" encoding="UTF-8"?> 
<beans 
    xmlns="http://xmlns.jcp.org/xml/ns/javaee" 
    xmlns:xsi="http://www.w3.org/2001/XMLSchema-instance" 
    xsi:schemaLocation="http://xmlns.jcp.org/xml/ns/javaee 
         http://xmlns.jcp.org/xml/ns/javaee/beans_1_1.xsd" 
    bean-discovery-mode="all"> 
</beans> 
相關問題