手动注入生产者数据

Manual injection of producer data

问题

我正在处理对遗留数据和一些多功能实现的支持。我可以使用如下基本代码轻松注入完全托管的 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 实现中注入数据的情况下,它不起作用。

使用 classic 示例:

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

在我的 class 中,这没有得到解决:

@Inject
@LoggerType
Logger log;

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

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

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

详情

我正在使用 Wildly 进行部署:

限定符非常简单:

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

让我们按顺序来。

您正在部署到 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。检查包含您的制作人的 class 文件的导入部分。

  2. 您在 implicit bean archive or the bean discovery mode of your archive is annotated and the bean containing your producer don't have a bean defining annotation。在包含生产者的class上添加@Dependent。

  3. 包含您的制作人 doesn't meet the conditions to be a bean 的 class。检查您是否可以注入此 bean。

  4. 您的 war 包含 WildFly 提供的 Java EE jar,这会导致不可预测的行为。检查你的 WEB-INF/lib 看看你上面提到的库之一是否没有与你的应用程序打包在一起(它们应该按照 Maven 中提供的范围)。

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