手动注入生产者数据

时间:2015-01-19 18:00:06

标签: java-ee cdi

问题

我正在支持遗留数据和一些多功能实现。我可以使用基本代码轻松注入完全托管的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的注解-api_1.1_spec
  • 的JBoss-EJB-api_3.1_spec

限定符非常简单:

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

1 个答案:

答案 0 :(得分:2)

让我们按顺序排列。

您正在部署到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,看看您上面提到的其中一个lib是否与您的应用程序打包在一起(它们的范围应该是Maven中提供的)。

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