具有@Resource的JNDI查找,没有名称或查找属性

时间:2018-07-04 19:19:17

标签: java-ee ejb

我已经在Payara上部署的Java EE应用程序中看到以下代码:

public class MyClass {
    @Resource
    ManagedScheduledExecutorService scheduler;

    <...>
}

如果有所作为,这是启用CDI的应用程序。 在Payara中,存在ManagedScheduledExecutorService的资源,其JNDI名称为concurrent/__defaultManagedScheduledExecutorService,并且逻辑JNDI名称为java:comp/DefaultManagedScheduledExecutorService

根据类名称和字段创建资源的JNDI名称。这与上面的名称不匹配。

到目前为止,我对资源注入的理解是,您可以使用lookup属性纯粹按名称引用现有的JNDI条目。但是如您所见,没有使用任何属性,它仍然有效。

为什么?是否有特定于该容器的回退机制,或者某些Java规范定义了此行为?

1 个答案:

答案 0 :(得分:1)

实际上是“一些Java规范定义了这种行为”。

实际上,Java EE 7/8规范中的§EE.5.21默认并发实用工具对象提供了以下定义:

  

Java EE产品提供者必须使应用程序可以使用以下JNDI名称访问Java EE对象的默认并发实用工具:

     
      
  • java:comp/DefaultManagedExecutorService用于预配置的托管执行器服务
  •   
  • java:comp/DefaultManagedScheduledExecutorService用于预配置的托管计划执行程序服务
  •   
  • java:comp/DefaultManagedThreadFactory用于预配置的托管线程工厂
  •   
  • java:comp/DefaultContextService用于预配置的上下文服务
  •   
     

应用程序组件提供者或部署者可以使用Resource批注的lookup元素或resource-ref部署描述符元素的lookup-name元素,将资源引用显式绑定到默认的Concurrency Utilities对象。例如,

@Resource(name="myManagedExecutorService, 
          lookup="java:comp/DefaultManagedExecutorService")
ManagedExecutorService myManagedExecutorService;`  
     

在没有这种绑定的情况下,引用的映射将默认为产品的默认托管执行程序服务。