在自定义扩展中注册带有注入点的动态 bean 会在 cdi 容器 bean 验证阶段引发不满足的依赖项异常

问题描述 投票:0回答:1

我正在尝试编写一个 cdi 扩展来注册一个自定义 bean,该 bean 本身已注入托管 bean。 将应用程序部署到 payara 服务器时,我收到错误消息:

  Exception during lifecycle processing
org.glassfish.deployment.common.DeploymentException: CDI deployment failure:WELD-001408: Unsatisfied dependencies for type ClassicTestBean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private cditest.DynamicTestBean.bean
  at cditest.DynamicTestBean.bean(DynamicTestBean.java:0)
 -- WELD-001408: Unsatisfied dependencies for type ClassicTestBean with qualifiers @Default
  at injection point [BackedAnnotatedField] @Inject private cditest.DynamicTestBean.bean
  at cditest.DynamicTestBean.bean(DynamicTestBean.java:0)

我的代码如下:

public class TestExtension implements Extension {
    public void lookupBeans(@Observes AfterBeanDiscovery  event, BeanManager bm) {
        event.addBean()
            .read(bm.createAnnotatedType(DynamicTestBean.class))
            .beanClass(DynamicTestBean.class)
            .scope(ApplicationScoped.class);
    }
}

public class DynamicTestBean {
    @Inject
    private ClassicTestBean bean;

    public void doSomething() {
        bean.doSomething();
    }
}

@Dependent
public class ClassicTestBean {
    public void doSomething() {
        System.out.println("test bean do");
    }
}

@Singleton
@Startup
public class TestStartup {

    @Inject
    private DynamicTestBean target;
    
    @PostConstruct
    public void init() {
        target.doSomething();
    }
}

文件 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_2_0.xsd"
    version="2.0" bean-discovery-mode="annotated">
</beans>

CDI 容器无法解析类 DynamicTestBean 中 ClassicTestBean 注入的依赖关系。

我尝试解决问题但没有成功:

  • 向ClassicTestBean添加@Default注释
  • 当我通过将“@Inject private ClassicTestBean bean”替换为“private ClassicTestBean bean = new ClassicTestBean()”来删除注入时,示例应用程序可以正常工作。所以注册 DynamicTestBean 是有效的。

这里有人可以帮助我吗?先谢谢大家了!

cdi
1个回答
0
投票
© www.soinside.com 2019 - 2024. All rights reserved.