Jakarta ee 人工注入生产者数据 问题:

Jakarta ee 人工注入生产者数据 问题:,jakarta-ee,cdi,Jakarta Ee,Cdi,我正在支持遗留数据和一些多功能实现。我能够使用以下基本代码轻松注入完全管理的bean实例: InitialContext initialContext = new InitialContext(); BeanManager beanManager = (BeanManager) initialContext.lookup(BEAN_MANAGER_JNDI_NAME); Set<Bean<?>> beans = beanManager.getBeans(beanClass

我正在支持遗留数据和一些多功能实现。我能够使用以下基本代码轻松注入完全管理的bean实例:

InitialContext initialContext = new InitialContext();
BeanManager beanManager = (BeanManager) initialContext.lookup(BEAN_MANAGER_JNDI_NAME);
Set<Bean<?>> beans = beanManager.getBeans(beanClass);
Bean bean = beanManager.getBeans(beanClass).iterator().next();
CreationalContext creationalContext = beanManager.createCreationalContext(bean);
T managedInstance = (T) beanManager.getReference(bean, beanClass, creationalContext);
在我的课堂上,这个问题没有得到解决:

@Inject
@LoggerType
Logger log;
我的解决方法就是获取我正在使用的类的一个完全托管的实例,然后以以下方式复制内容:

MyType managedInstance = CdiUtilities.getManagedInstance(getClass());
this.log = managedInstance.log;
我将如何做到这一点? 我需要做些什么来注册
@Producer
数据吗

细节 我正在部署上,使用:

  • jboss-javaee-6.0-with-tools(1.0.0.M1)
  • javax.servlet-api(3.1.0)
  • javaxcdiapi
  • jboss-annotations-api_1.1_规范
  • jboss-ejb-api_3.1_规范
限定符非常简单:

@Qualifier
@Retention (RetentionPolicy.RUNTIME)
@Target ({ElementType.FIELD, ElementType.METHOD})
public @interface LoggerType { }

让我们把事情按顺序处理

您正在部署到WildFly,因此您的目标是JavaEE7和CDI1.1(WildFly 8.0.0和8.1.0)或CDI1.2(WildFly 8.2.0)

在所有情况下,您都可以简化查找代码,如下所示:

    BeanManager beanManager = CDI.current().getBeanManager();
    Bean bean = beanManager.resolve(beanManager.getBeans(beanClass));
    CreationalContext creationalContext = beanManager.createCreationalContext(bean);
    T managedInstance = (T) beanManager.getReference(bean, beanClass, creationalContext);
关于如何使用此代码,您没有给出很多信息。请记住,可能有比这更好的集成遗留代码的方法

关于你的制作人问题。我认为这个问题有四个可能的原因

  • 您使用的是
    @javax.ws.rs.products
    ,而不是
    @javax.enterprise.inject.products
    。检查包含生产者的类文件的导入部分

  • 您在一个中,并且包含您的生产者的bean没有一个。根据包含生产者的类添加@Dependent

  • 包含制作人的类。检查您是否可以注入这个bean

  • 您的war包含WildFly提供的JavaEE JAR,这会导致不可预测的行为。检查您的
    WEB-INF/lib
    ,查看您上面提到的lib中是否有一个没有与您的应用程序打包在一起(它们的范围应与Maven中提供的范围相同)


  • 顺便说一句,您应该使用Java EE 7依赖项来编译代码,因为您正在部署到WildFly。

    当您使用经典示例时,应用程序服务器是否会引发异常?您的qualifier@LoggerType代码是什么样子的?请同时指出您正在使用的CDI实现、版本等。上面添加了信息。一切正常。1.核实2。把事情改变过来,让它工作起来——这就是问题3。核实4。现在验证了,我只需要修复
    注入点
    问题,一切正常。看起来我需要重新评估我对第二个note.FYI的理解-在验证其他事情是否有效后,我也更新了EE7依赖项。我不知道这是Wildfly的“应该”,但我知道现在也要关注这一点。更好的是,我完全忽略了。是的,DS是一个增强CDI开发的伟大解决方案。关于Wildfly的EE7依赖关系,这不是强制性的(EE6应用程序在其上运行),但最好能够访问EE7中的所有新API
        BeanManager beanManager = CDI.current().getBeanManager();
        Bean bean = beanManager.resolve(beanManager.getBeans(beanClass));
        CreationalContext creationalContext = beanManager.createCreationalContext(bean);
        T managedInstance = (T) beanManager.getReference(bean, beanClass, creationalContext);