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
注释GestorPersistencia
和ApiPortaFib
。另一种解决方案是使用 bean-discovery-mode="all"
我有一套模块;其中一些定义共享接口,其他的则为它们提供实现。
在我的一个 类 中,我尝试注入 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
注释GestorPersistencia
和ApiPortaFib
。另一种解决方案是使用 bean-discovery-mode="all"