我有一套模块;其中几个定义了共享接口,其他接口为它们提供了实现。
在我的一个课程中,我尝试注入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的警告:没有豆符合注射条件,但我很担心,因为该项目没有依赖于具有两种实现的项目。
受影响的接口是:
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;
}
}
和
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
文件。
当它部署时,它无法找到这两个CDI bean作为属性进行注入,尽管这些jar已包含在战争中。更奇怪的是,仅通过评论两个@Inject
注释,应用程序(发生了更多的CDI bean)就成功部署了。)
我做错了什么?
服务器是Windows上的JBoss WildFly 9.0.2。
答案 0 :(得分:4)
问题是您的实现未使用 Bean定义注释(link)进行注释。 @Default
只是一个限定符。您可以做的是使用GestorPersistencia
注释ApiPortaFib
和@Dependent
。另一种解决方案是使用bean-discovery-mode="all"