Java JBoss EAP 7.1.6、CDI 1.2和排除扫描don';行不通

Java JBoss EAP 7.1.6、CDI 1.2和排除扫描don';行不通,java,jboss,cdi,Java,Jboss,Cdi,我使用JBoss EAP 7.1.6(带有焊接api-2.4.0.SP1-redhat-1.jar)。我的web应用程序(war)嵌入了一个“公共”库,其中包含一个备用bean,如下所示: @Alternative @ApplicationScoped public class EntityManagerProvider { @PersistenceUnit private EntityManagerFactory entityManagerFactory; 我的web应用程

我使用JBoss EAP 7.1.6(带有焊接api-2.4.0.SP1-redhat-1.jar)。我的web应用程序(war)嵌入了一个“公共”库,其中包含一个备用bean,如下所示:

@Alternative
@ApplicationScoped
public class EntityManagerProvider {

    @PersistenceUnit
    private EntityManagerFactory entityManagerFactory;
我的web应用程序没有使用这个替代bean。在这种情况下,我没有任何持久性机制。 当我部署webapp(依赖于第三方库)时,我会收到以下stacktrace:

15:01:08,196 ERROR [org.jboss.msc.service.fail] (MSC service thread 1-6) MSC000001: Failed to start service jboss.deployment.unit."sample-monitoring.war".WeldStartService: org.jboss.msc.service.StartException in service jboss.deployment.unit."sample-monitoring.war".WeldStartService: Failed to start service
    at org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1978)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
Caused by: java.lang.IllegalArgumentException: WFLYWELD0037: Error injecting persistence unit into CDI managed bean. Can't find a persistence unit named «  » in deployment sample-monitoring.war  for injection point private javax.persistence.EntityManager org.sample.EntityManagerProvider.entityManagerFactory
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.getScopedPUName(WeldJpaInjectionServices.java:114)
    at org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.registerPersistenceContextInjectionPoint(WeldJpaInjectionServices.java:77)
    at org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:350)
    at org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:338)
    at org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createFieldResourceInjection(ResourceInjectionFactory.java:216)
    at org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createResourceInjections(ResourceInjectionFactory.java:188)
    at org.jboss.weld.injection.ResourceInjectionFactory.discoverType(ResourceInjectionFactory.java:448)
    at org.jboss.weld.injection.ResourceInjectionFactory.getResourceInjections(ResourceInjectionFactory.java:96)
    at org.jboss.weld.injection.producer.ResourceInjector.<init>(ResourceInjector.java:59)
    at org.jboss.weld.injection.producer.ResourceInjector.of(ResourceInjector.java:49)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.<init>(BeanInjectionTarget.java:63)
    at org.jboss.weld.injection.producer.BeanInjectionTarget.createDefault(BeanInjectionTarget.java:47)
    at org.jboss.weld.manager.InjectionTargetFactoryImpl.chooseInjectionTarget(InjectionTargetFactoryImpl.java:113)
    at org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:86)
    at org.jboss.weld.bean.ManagedBean.<init>(ManagedBean.java:100)
    at org.jboss.weld.bean.ManagedBean.of(ManagedBean.java:80)
    at org.jboss.weld.bootstrap.AbstractBeanDeployer.createManagedBean(AbstractBeanDeployer.java:274)
    at org.jboss.weld.bootstrap.BeanDeployer.createClassBean(BeanDeployer.java:226)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:74)
    at org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:71)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
    at org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
    at java.util.concurrent.FutureTask.run(FutureTask.java:266)
    at java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
    at java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
    at java.lang.Thread.run(Thread.java:748)
    at org.jboss.threads.JBossThread.run(JBossThread.java:320)
15:01:08196错误[org.jboss.msc.service.fail](msc服务线程1-6)MSC000001:无法启动服务jboss.deployment.unit.“sample monitoring.war”.WeldStartService:org.jboss.msc.service.StartException in service jboss.deployment.unit.“sample monitoring.war”。WeldStartService:无法启动服务
位于org.jboss.msc.service.ServiceControllerImpl$StartTask.run(ServiceControllerImpl.java:1978)
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
原因:java.lang.IllegalArgumentException:WFLYWELD0037:将持久性单元注入CDI托管bean时出错。在注入点专用javax.persistence.EntityManager org.sample.EntityManager Provider.EntityManager Factory的部署sample-monitoring.war中找不到名为«»的持久化单元
位于org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.getScopedPaname(WeldJpaInjectionServices.java:114)
位于org.jboss.as.weld.services.bootstrap.WeldJpaInjectionServices.registerPersistenceContextInjectionPoint(WeldJpaInjectionServices.java:77)
位于org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:350)
位于org.jboss.weld.injection.ResourceInjectionFactory$PersistenceContextResourceInjectionProcessor.getResourceReferenceFactory(ResourceInjectionFactory.java:338)
位于org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createFieldResourceInjection(ResourceInjectionFactory.java:216)
位于org.jboss.weld.injection.ResourceInjectionFactory$ResourceInjectionProcessor.createResourceInjections(ResourceInjectionFactory.java:188)
位于org.jboss.weld.injection.ResourceInjectionFactory.discoverType(ResourceInjectionFactory.java:448)
位于org.jboss.weld.injection.ResourceInjectionFactory.getResourceInjections(ResourceInjectionFactory.java:96)
位于org.jboss.weld.injection.producer.ResourceInjector.(ResourceInjector.java:59)
位于org.jboss.weld.injection.producer.ResourceInjector.of(ResourceInjector.java:49)
位于org.jboss.weld.injection.producer.BeanInjectionTarget。(BeanInjectionTarget.java:63)
位于org.jboss.weld.injection.producer.BeanInjectionTarget.createDefault(BeanInjectionTarget.java:47)
在org.jboss.weld.manager.InjectionTargetFactoryImpl.chooseInjectionTarget(InjectionTargetFactoryImpl.java:113)上
位于org.jboss.weld.manager.InjectionTargetFactoryImpl.createInjectionTarget(InjectionTargetFactoryImpl.java:86)
位于org.jboss.weld.bean.ManagedBean(ManagedBean.java:100)
位于org.jboss.weld.bean.ManagedBean.of(ManagedBean.java:80)
位于org.jboss.weld.bootstrap.AbstractBeanDeployer.createManagedBean(AbstractBeanDeployer.java:274)
位于org.jboss.weld.bootstrap.BeanDeployer.createClassBean(BeanDeployer.java:226)
位于org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:74)
位于org.jboss.weld.bootstrap.ConcurrentBeanDeployer$2.doWork(ConcurrentBeanDeployer.java:71)
在org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:62)
在org.jboss.weld.executor.IterativeWorkerTaskFactory$1.call(IterativeWorkerTaskFactory.java:55)
在java.util.concurrent.FutureTask.run(FutureTask.java:266)处
位于java.util.concurrent.ThreadPoolExecutor.runWorker(ThreadPoolExecutor.java:1149)
位于java.util.concurrent.ThreadPoolExecutor$Worker.run(ThreadPoolExecutor.java:624)
运行(Thread.java:748)
位于org.jboss.threads.JBossThread.run(JBossThread.java:320)
我尝试在beans.xml中显式排除持久性类的扫描:

<?xml version="1.0" encoding="UTF-8"?>
<beans 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"
        bean-discovery-mode="all" version="1.2">
        <scan>
            <exclude name="com.other.library.dao.util.EntityManagerProvider" />
            <exclude name="com.other.library.dao.util.**" />
        </scan>
</beans>

但我仍然收到同样的错误:-(


我做错了什么?提前谢谢。

这是
EntityManager提供程序的确切代码吗
?我觉得奇怪的是,一个库以这种方式声明了一个替代方案。库的JAR中有
bean.xml
文件吗?它的内容是什么?顺便问一下,
适用于同一个bean归档,所以您不会这么做可以这样从库中排除bean!是的,第三方库中有一个beans.xml:@RigobertSong找到解决方案了吗?我试图从项目依赖项中排除bean,但没有成功。这是
EntityManagerProvider
的确切代码吗?我觉得库声明alte很奇怪r通过这种方式激活。库的JAR中有
beans.xml
文件吗?它的内容是什么?顺便说一句,
适用于同一个bean存档,因此您将无法通过这种方式将bean从库中排除!是的,第三方库中有一个beans.xml:@RigobertSong您找到解决方案了吗?I'我试图从项目依赖项中排除bean,但没有成功。