是否有JNDI命名空间约定?

我已经下载了JBoss EAP 6.1,我将添加一个新的数据源。 我必须将数据源绑定到JNDI名称。 通过读取示例数据源的JNDI名称,该名称是:

java:jboss/datasources/ExampleDS 

我看到他们在java:jboss之后使用了datasources 。 这只是一个命名约定 – 我无法在任何地方找到 – 或者使用java:jboss/bananaboat/MyDS是不是很好java:jboss/bananaboat/MyDS

下面列出的第一部分是正确的 – 例如java:comp是范围而其余部分只是普通的层次结构组织?

 java:comp/ - The namespace is scoped to the current component (ie EJB) java:module/ - Scoped to the current module java:app/ - Scoped to the current application java:global/ - Scoped to the application server 

https://docs.jboss.org/author/display/AS71/JNDI+Reference

我不得不自己回答同样的问题并将这些链接拉到一起。

简而言之, JNDI命名策略可以是任何一个,但JEE定义了自己的:

JNDI的定义独立于任何特定的命名和目录服务实现。

但是,确定使用JNDI的一组有限命名策略的一个重要平台是…… JEE

这将是数据源的最常规名称:

企业名称空间根植于java URL方案的URL上下文。

例如,JDBC Salary数据库可能具有名称“ java:comp/env/jdbc/Salary ”。

  • comp与为组件相关的绑定保留的子树绑定。
  • env绑定到为组件的环境相关绑定保留的子树,由其部署描述符定义。
  • 资源工厂引用放在由其资源管理器类型区分的子树中。
    • …用于JDBC DataSource引用的jdbc

JEE 7教程还详细介绍了在32.4.1.1 Portable JNDI语法中引用EJB的命名策略。

请注意,注入DataSource @Resource注释通常指定相对于java:comp/env JNDI名称java:comp/env – 对于可移植和可部署的解决方案,请参阅此答案此答案

正如您在更新的链接中所提到的, java:jboss namespace是仅由WildFly / JBoss提供的自定义扩展。


要回答这个问题,标准命名空间下的子树只是普通的层次结构 。 显然,只有应用服务器,文档,进程等(广泛地)识别这些子树才有意义。否则,我猜几乎平坦的键值或随机bananaboat/MyDS很好但仍然必须“挂载”在受支持的命名空间下,如java:jboss

这完全来自记忆(不久前我被其他团队成员告知):

java:前缀是JBoss / EE标准。 它应该为所有非可序列化资源加上前缀,这意味着它们是jvm的本地资源。 之后,您可以命名任何您喜欢的名称,以形成“目录”之类的结构。 例如,如果您使用JNDI来获取绑定“java:jboss / datasources”,您将获得该名称下列出的所有资源的子树。 它将包含ExampleDS和可能的其他DataSource。

回答你的问题:你不必在java:jboss之后命名数据源。 但将它命名为有意义的东西是有意义的。