JNDI资源的CDI生产者方法

时间:2014-09-09 14:58:22

标签: java dependency-injection cdi

是否可以使用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生产者一起知道?

0 个答案:

没有答案