野蝇找不到@Default豆子



我有一组模块;其中一些定义共享接口,其他模块为它们提供实现。

在我的一个类中,我尝试注入 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"

最新更新