【问题标题】:Manual injection of producer data手动注入生产者数据
【发布时间】:2015-01-19 18:00:05
【问题描述】:

问题

我正在处理遗留数据和一些多功能实现的支持。我可以使用以下基本代码轻松注入完全托管的 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);

但是,如果想从@Producer 实现中注入数据,它就不起作用了。

使用经典示例:

@Produces
@LoggerType
public Logger getLogger (InjectionPoint) { ... }

在我的课堂上这没有得到解决:

@Inject
@LoggerType
Logger log;

我的解决方法只是获取我正在使用的类的完全托管实例,然后以以下方式复制内容:

MyType managedInstance = CdiUtilities.getManagedInstance(getClass());
this.log = managedInstance.log;

我将如何做到这一点? 我需要做些什么来注册@Producer 数据吗?

详情

我正在 Wildly 上使用:

  • jboss-javaee-6.0-with-tools (1.0.0.M1)
  • javax.servlet-api (3.1.0)
  • javax cdi-api
  • jboss-annotations-api_1.1_spec
  • jboss-ejb-api_3.1_spec

限定词非常简单:

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

【问题讨论】:

  • 使用经典示例时应用服务器会抛出异常吗?你的限定符@LoggerType 的代码是什么样的?
  • 还请说明您正在使用的 CDI 实现、版本等。
  • 在上面添加了信息。

标签: jakarta-ee cdi


【解决方案1】:

让我们按顺序来吧。

您正在部署到 WildFly,因此您的目标是 Java EE 7 和 CDI 1.1(WildFly 8.0.0 和 8.1.0)或 CDI 1.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);

您没有提供很多有关如何使用此代码的信息。请记住,集成遗留代码的方式可能比这个更好...

关于您的制片人问题。我看到此问题的 4 个可能原因。

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

  2. 您在 implicit bean archive or the bean discovery mode of your archive is annotated 中,并且包含您的生产者的 bean 没有 bean defining annotation。在包含生产者的类上添加@Dependent。

  3. 包含您的生产者doesn't meet the conditions to be a bean 的类。检查您是否可以注入此 bean。

  4. 您的战争包含 WildFly 提供的 Java EE jar,这会导致不可预测的行为。检查您的 WEB-INF/lib 以查看您上面提到的其中一个库是否未与您的应用一起打包(它们的范围应与 Maven 中提供的一样)。

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

【讨论】:

  • 一切正常。 1. 已验证 2. 换了东西并使其正常工作 - 这就是问题 3. 已验证 4. 已验证 现在,我只需要修复 InjectionPoint 问题,一切都很好。看来我需要重新评估我对第二个音符的理解。
  • 仅供参考 - 在验证其他工作正常后,我也更新了 EE7 依赖项。我不知道这是 Wildfly 的“应该”,但我现在也知道要密切关注这一点。
  • 更好 - 我完全忽略了DeltaSpike
  • 是的,DS 是增强 CDI 开发的绝佳解决方案。关于 Wildfly 的 EE 7 依赖项,这不是强制性的(EE 6 应用程序在其上运行),但最好能够访问 EE 7 中的所有新 API
猜你喜欢
  • 1970-01-01
  • 2013-09-17
  • 1970-01-01
  • 1970-01-01
  • 2017-02-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多