是否可以使用CDI注入JNDI资源,并且只在运行时知道JNDI名称?
我尝试过这样的事情:
public class InjectionClient {
@Inject
@Any
Instance<MyJndiResource> anyResource;
public MyJndiResource JndiResource() {
MyJndiResource anyResource.select(new JndiQualifierLiteral(containerJndi)).get();
//do stuff...
}
}
其中MyJndiResource
由Producer方法注入
public class MyJndiResourceProducer {
@Produces
@JndiQualifier("nonbinding")
public MyJndiResource produceWorkerByContainerJndi(InjectionPoint injectionPoint) {
String jndi = injectionPoint.getAnnotated().getAnnotation(JndiQualifier.class).value();
return (MyJndiResource) new InitialContext().lookup(containerJndi));
}
但是后来我在生产者方法的第一行获得了NPE。可能是因为injectPoint的注释是基于Instance
的注入点,而不是基于Instance#select()
参数。
限定词的jndi属性是非约束性的:
@Qualifier
@Retention(RUNTIME)
@Target({FIELD, TYPE, METHOD, PARAMETER})
public @interface JndiQualifier {
@Nonbinding
String value();
}
为了完整起见JndiQualifierLiteral
代码:
public class JndiQualifierLiteral extends AnnotationLiteral<JndiQualifier> implements JndiQualifier {
private String jndi;
public JndiQualifierLiteral(String jndi) {
this.jndi = jndi;
}
@Override
public String value() {
return jndi;
}
}
是否有任何解决方案,以便我可以生成JNDI资源,其JNDI名称仅在运行时与CDI生产者一起知道?