我有一組模塊;其中幾個定義了共享接口,其他的則爲它們提供了實現。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。
你已經提到過,帶'@ Default'註解的bean位於單獨的項目中。你確定這些項目(子模塊?)也打包到WAR檔案中嗎? – Arek
@Ajan是的,他們都出現在'WEB-INF/lib'中 – SJuan76