我正在支持遗留数据和一些多功能实现。我可以使用基本代码轻松注入完全托管的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使用:
限定符非常简单:
@Qualifier
@Retention (RetentionPolicy.RUNTIME)
@Target ({ElementType.FIELD, ElementType.METHOD})
public @interface LoggerType { }
答案 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个可能原因。
您使用@javax.ws.rs.Produces
代替@javax.enterprise.inject.Produces
。检查包含生产者的类文件的导入部分。
您在implicit bean archive or the bean discovery mode of your archive is annotated
,并且包含您的制作人的bean没有bean defining annotation。在包含生产者的类上添加@Dependent。
包含您的制作人doesn't meet the conditions to be a bean的类。检查你是否可以注入这个bean。
你的战争包含WildFly提供的Java EE jar,这会导致不可预测的行为。检查您的WEB-INF/lib
,看看您上面提到的其中一个lib是否与您的应用程序打包在一起(它们的范围应该是Maven中提供的)。
顺便说一句,您应该使用Java EE 7依赖项来编译代码,因为您正在部署到WildFly。