手动注入生产者数据
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 进行部署:
- 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 { }
让我们按顺序来。
您正在部署到 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 个可能的原因。
您正在使用 @javax.ws.rs.Produces
而不是 @javax.enterprise.inject.Produces
。检查包含您的制作人的 class 文件的导入部分。
您在 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。
包含您的制作人 doesn't meet the conditions to be a bean 的 class。检查您是否可以注入此 bean。
您的 war 包含 WildFly 提供的 Java EE jar,这会导致不可预测的行为。检查你的 WEB-INF/lib
看看你上面提到的库之一是否没有与你的应用程序打包在一起(它们应该按照 Maven 中提供的范围)。
顺便说一句,你应该使用 Java EE 7 依赖项来编译你的代码,因为你要部署到 WildFly。
问题
我正在处理对遗留数据和一些多功能实现的支持。我可以使用如下基本代码轻松注入完全托管的 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 进行部署:
- 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 { }
让我们按顺序来。
您正在部署到 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 个可能的原因。
您正在使用
@javax.ws.rs.Produces
而不是@javax.enterprise.inject.Produces
。检查包含您的制作人的 class 文件的导入部分。您在 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。包含您的制作人 doesn't meet the conditions to be a bean 的 class。检查您是否可以注入此 bean。
您的 war 包含 WildFly 提供的 Java EE jar,这会导致不可预测的行为。检查你的
WEB-INF/lib
看看你上面提到的库之一是否没有与你的应用程序打包在一起(它们应该按照 Maven 中提供的范围)。
顺便说一句,你应该使用 Java EE 7 依赖项来编译你的代码,因为你要部署到 WildFly。