WildFly 找不到@Default bean

WildFly does not find @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:没有适合注入的 bean”的 warning,但我有点担心,因为该项目没有对具有两种实现的项目的依赖性。

受影响的接口有:

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 已包含在 war 中。更奇怪的是,仅通过注释两个 @Inject 注释,应用程序(发生了很多 CDI bean)就成功部署了。

我做错了什么?

服务器是 JBoss WildFly 9.0.2 Windows。

问题是您的实现未使用 Bean 定义注释 (link) 进行注释。 @Default 只是一个限定符。你可以做的是用@Dependent注释GestorPersistenciaApiPortaFib。另一种解决方案是使用 bean-discovery-mode="all"