WildFly找不到@Default bean

时间:2016-03-07 12:36:59

标签: java-ee cdi wildfly

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

在我的一个课程中,我尝试注入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。

1 个答案:

答案 0 :(得分:4)

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