2016-03-07 17 views
0

我有一組模塊;其中幾個定義了共享接口,其他的則爲它們提供了實現。WildFly找不到@Default bean

在我的一個類中,我嘗試注入4個接口;其中兩人因不明原因給我造成很多麻煩。

所以,在ControladorProcesoFirma我:

import es.ssib.otic.inte_portafib.private_interfaces.IApiPortaFib; 
import es.ssib.otic.inte_portafib.private_interfaces.IControladorCopiaDigitalAutentica; 
import es.ssib.otic.inte_portafib.private_interfaces.IControladorCustodia; 
import es.ssib.otic.inte_portafib.private_interfaces.IFileManager; 
import es.ssib.otic.inte_portafib.private_interfaces.IGestorPersistencia; 
import es.ssib.otic.inte_portafib.public_interfaces.EstadoProcesoFirma; 
import es.ssib.otic.inte_portafib.public_interfaces.IControladorProcesoFirma; 
... 
@Default 
public class ControladorProcesoFirma 
    implements IControladorProcesoFirma { 

    @Inject 
    private IApiPortaFib apiPortaFib; 

    @Inject 
    private IGestorPersistencia gestorPersistencia; 

    @Inject 
    private IControladorCustodia controladorCustodia; 

    @Inject 
    private IControladorCopiaDigitalAutentica controladorCopiaDigitalAutentica; 

    @Inject 
    private IFileManager gestorFicheros; 
    ... 
} 

現在,在Eclipse中的兩個第一@Inject告訴我一個關於「JSR-346的警告:沒有豆資格injection`,但我有點擔心,因爲項目對具有兩種實現的項目沒有依賴性。

受影響的接口是:

package es.ssib.otic.inte_portafib.private_interfaces; 

import java.io.InputStream; 

import es.ssib.otic.inte_portafib.public_interfaces.IProcesoFirma; 

public interface IApiPortaFib { 
    public Long enviarProcesoPortaFib(
     IProcesoFirma procesoFirma, 
     InputStream contenidoFicheroOriginal); 

    public InputStream recuperarFicheroFirmado(
     Long idPortaFib); 
} 

package es.ssib.otic.inte_portafib.private_interfaces; 

import java.util.Collection; 

import es.ssib.otic.inte_portafib.public_interfaces.IProcesoFirma; 

public interface IGestorPersistencia { 
    public IProcesoFirma persistir(
     IProcesoFirma procesoFirma); 

    public IProcesoFirma recuperar(
     Long idProcesoFirma); 

    public Collection<? extends IProcesoFirma> recuperarTodos(); 
} 

,並且在兩個單獨的項目,我有實現(我已經剝離,以最低限度):

package es.ssib.otic.inte_portafib.portafib_bridge.api; 

import java.io.InputStream; 
import java.util.logging.Logger; 

import javax.enterprise.inject.Default; 
import javax.inject.Inject; 
import es.ssib.otic.inte_portafib.private_interfaces.IApiPortaFib; 
import es.ssib.otic.inte_portafib.public_interfaces.IProcesoFirma; 

@Default 
public class ApiPortaFib 
    implements IApiPortaFib { 

    private static final Logger LOG = 
     Logger. 
      getLogger(
       ApiPortaFib. 
        class. 
        getName()); 

    @Inject 
    private IConfiguracionPortaFIB configuracionPortaFIB; 

    public ApiPortaFib() { 
    } 

    @Override 
    public Long enviarProcesoPortaFib(
     IProcesoFirma procesoFirma, 
     InputStream contenidoFichero) { 
     return 0L; 
    } 

    @Override 
    public InputStream recuperarFicheroFirmado(
     Long idPortaFib) { 
     return null; 
    } 
} 

and

package es.ssib.otic.inte_portafib.persistencia_memoria; 

import java.util.Collection; 

import javax.enterprise.inject.Default; 

import es.ssib.otic.inte_portafib.private_interfaces.IGestorPersistencia; 
import es.ssib.otic.inte_portafib.public_interfaces.IProcesoFirma; 

@Default 
public class GestorPersistencia 
    implements IGestorPersistencia { 

    @Override 
    public IProcesoFirma persistir(
     IProcesoFirma procesoFirma) { 

     return procesoFirma; 
    } 

    @Override 
    public IProcesoFirma recuperar(
     Long idProcesoFirma) { 
     return null; 
    } 

    @Override 
    public Collection<? extends IProcesoFirma> recuperarTodos() { 
     return null; 
    } 
} 

所有接口和實現被打包爲jar,各自具有裸露META-INF/beans.xml文件

<?xml version="1.0"?> 
<beans 
    bean-discovery-mode="annotated" 
    version="1.1" 
    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"/> 

最後,所有的應用程序被打包爲一個.war,還與一個WEB-INF/beans.xml文件。

當它部署時,儘管jar已經包含在戰爭中,但它無法將這兩個CDI bean中的任何一個作爲屬性注入。更奇怪的是,僅僅通過評論兩個@Inject註釋,應用程序(發生了多個CDI bean)成功部署)。

我在做什麼錯?

服務器是Windows上的JBoss WildFly 9.0.2。

+0

你已經提到過,帶'@ Default'註解的bean位於單獨的項目中。你確定這些項目(子模塊?)也打包到WAR檔案中嗎? – Arek

+0

@Ajan是的,他們都出現在'WEB-INF/lib'中 – SJuan76

回答

4

問題是您的實現沒有用Bean註釋定義註釋link)。 @Default只是一個限定符。你可以做的是用@Dependent註釋GestorPersistenciaApiPortaFib。另一種解決方案是使用bean-discovery-mode="all"

+0

謝謝,我仍然需要閱讀更多關於這些註釋的內容,以及爲什麼它有時可以在沒有它們的情況下運行,但現在它的工作原理應該如此。 – SJuan76

相關問題