我有一组模块;其中一些定义共享接口,其他模块为它们提供实现。
在我的一个类中,我尝试注入 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:没有符合注入条件的 bean"的警告,但我并不担心,因为该项目不依赖于同时具有这两种实现的项目。
受影响的接口包括:
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 中的任何一个作为属性注入,尽管这些罐子已被包含在战争中。更奇怪的是,只需注释两个@Inject
注释,应用程序(发生更多CDI豆)就成功部署)。
我做错了什么?
服务器是Windows上的JBoss WildFly 9.0.2。
问题是你的实现没有用 Bean 定义注释(链接)进行注释。 @Default
只是一个限定词。您可以做的是注释GestorPersistencia
并用@Dependent
ApiPortaFib
。另一种解决方案是使用bean-discovery-mode="all"