Module java.naming
Package javax.naming

Interface Context

所有已知的子接口:
DirContext, EventContext, EventDirContext, LdapContext
所有已知的实现类:
InitialContext, InitialDirContext, InitialLdapContext

public interface Context
该接口表示一个命名上下文,它由一组名称到对象绑定组成。它包含用于检查和更新这些绑定的方法。

名称

传递给Context方法的每个名称都是相对于该上下文的。空名称用于命名上下文本身。名称参数永远不能为null。

大多数方法都有重载版本,其中一个使用Name参数,另一个使用String。这些重载版本是等效的,如果NameString参数只是相同名称的不同表示,则相同方法的重载版本行为相同。在下面的方法描述中,只有一个版本被完全记录。第二个版本有一个链接指向第一个版本:相同的文档适用于两者。

对于支持联邦的系统,传递给Context方法的String名称参数是复合名称。作为CompositeName实例的名称参数被视为复合名称,而不是CompositeName或其他复合名称实现的实例的Name参数被视为复合名称。这允许将NameParser.parse()的结果用作Context方法的参数。在JNDI 1.2之前,所有名称参数都被视为复合名称。

此外,对于支持联邦的系统,从list()listBindings()返回的NamingEnumeration中的所有名称都表示为字符串的复合名称。有关名称的字符串语法,请参阅CompositeName

对于不支持联邦的系统,名称参数(无论是Name还是String形式)和NamingEnumeration中返回的名称可能是其自己命名空间中的名称,而不是复合命名空间中的名称,由服务提供商自行决定。

异常

该接口中的所有方法都可以抛出NamingException或其任何子类。有关每个异常的详细信息,请参阅NamingException及其子类。

并发访问

不能保证对上下文实例的并发访问是同步的。需要同时访问单个上下文实例的线程应该在它们之间同步并提供必要的锁定。每个操作不同上下文实例的多个线程不需要同步。请注意,当传递一个空名称时,lookup方法将返回一个表示相同命名上下文的新上下文实例。

为了并发控制的目的,返回NamingEnumeration的上下文操作在枚举仍在使用时或在该操作生成的任何引用仍在被跟踪时不被视为已完成。

参数

传递给Context接口或其子接口的任何方法的Name参数不会被服务提供商修改。服务提供商可能会在操作的持续时间内保留对它的引用,包括方法结果的任何枚举和生成的任何引用的处理。在此期间,调用者不应修改该对象。由任何此类方法返回的Name由调用者拥有。调用者随后可以修改它;服务提供商不可以。

环境属性

JNDI应用程序需要一种方式来传达定义访问命名和目录服务的环境的各种首选项和属性。例如,一个上下文可能需要指定安全凭据才能访问服务。另一个上下文可能需要提供服务器配置信息。这些被称为上下文的环境Context接口提供了用于检索和更新此环境的方法。

环境从父上下文继承,随着上下文方法从一个上下文到下一个上下文的进行。对一个上下文环境的更改不会直接影响其他上下文的环境。

环境属性何时使用和/或验证其有效性是依赖于实现的。例如,一些与安全相关的属性由服务提供商用于“登录”到目录。此登录过程可能发生在创建上下文时,或在第一次在上下文上调用方法时。何时以及是否发生这种情况是依赖于实现的。当从上下文中添加或删除环境属性时,验证更改的有效性再次取决于实现。例如,某些属性的验证可能发生在进行更改时,或在下次在上下文上执行操作时,或根本不进行。

任何具有对上下文的引用的对象都可以检查该上下文的环境。不应将诸如明文密码之类的敏感信息存储在那里,除非已知实现会保护它。

资源文件

为了简化JNDI应用程序所需的环境设置任务,应用程序组件和服务提供商可以与资源文件一起分发。 JNDI资源文件是以属性文件格式(请参阅java.util.Properties)编写的文件,包含键/值对列表。键是属性的名称(例如“java.naming.factory.object”),值是为该属性定义的格式的字符串。以下是JNDI资源文件的示例:

java.naming.factory.object=com.sun.jndi.ldap.AttrsToCorba:com.wiz.from.Person java.naming.factory.state=com.sun.jndi.ldap.CorbaToAttrs:com.wiz.from.Person java.naming.factory.control=com.sun.jndi.ldap.ResponseControlFactory
JNDI类库读取资源文件并使属性值自由可用。因此,JNDI资源文件应被视为“全局可读”,不应在其中存储诸如明文密码之类的敏感信息。

有两种类型的JNDI资源文件:提供者应用程序

提供者资源文件

每个服务提供商都有一个可选资源,列出了特定于该提供商的属性。此资源的名称是:
[前缀/]jndiprovider.properties
其中前缀是提供商上下文实现的包名称,每个句点(“.”)转换为斜杠(“/”)。例如,假设服务提供商定义了一个具有类名com.sun.jndi.ldap.LdapCtx的上下文实现。该提供商的资源命名为com/sun/jndi/ldap/jndiprovider.properties。如果类不在包中,则资源的名称简单为jndiprovider.properties

JNDI类库中的某些方法使用指定JNDI工厂列表的标准JNDI属性:

  • java.naming.factory.object
  • java.naming.factory.state
  • java.naming.factory.control
  • java.naming.factory.url.pkgs
JNDI库在确定这些属性的值时将查阅提供者资源文件。除了这些属性之外,服务提供商可以自行决定在提供者资源文件中设置其他属性。服务提供商的文档应清楚说明允许使用哪些属性;文件中的其他属性将被忽略。

应用程序资源文件

当应用程序部署时,通常会有几个代码库目录和JAR文件在其类路径中。JNDI使用ClassLoader.getResources()定位所有类路径中命名为jndi.properties应用程序资源文件。此外,如果Java安装目录包含内置属性文件,通常为conf/jndi.properties,JNDI将其视为附加的应用程序资源文件。这些文件中包含的所有属性都将放入初始上下文的环境中。然后,此环境将被其他上下文继承。

对于在多个应用程序资源文件中找到的每个属性,JNDI使用找到的第一个值,或者在少数几种情况下,如果有意义的话,它会连接所有值(下面给出详细信息)。例如,如果在三个jndi.properties资源文件中找到“java.naming.factory.object”属性,则对象工厂列表是来自所有三个文件的属性值的连接。使用此方案,每个可部署组件负责列出其导出的工厂。当搜索工厂类时,JNDI会自动收集和使用所有这些导出列表。

属性搜索算法

当JNDI构造初始上下文时,上下文的环境将使用传递给构造函数的环境参数中定义的属性,系统属性和应用程序资源文件进行初始化。有关详细信息,请参阅InitialContext。然后,此初始环境将被其他上下文实例继承。

当JNDI需要确定属性的值时,它会按照以下两个来源的值的顺序合并值:

  1. 正在操作的上下文的环境。
  2. 正在操作的上下文的提供者资源文件(jndiprovider.properties)。
对于这两个来源中找到的每个属性,JNDI会按照以下方式确定属性的值。如果属性是指定JNDI工厂列表的标准JNDI属性(如上面所列),则值将连接为单个以冒号分隔的列表。对于其他属性,仅使用找到的第一个值。

当服务提供商需要确定属性的值时,通常会直接从环境中获取该值。服务提供商可以定义特定于提供商的属性,以放置在其自己的提供者资源文件中。在这种情况下,它应按照前一段描述的方式合并值。

通过这种方式,每个服务提供商开发人员都可以指定要与该服务提供商一起使用的工厂列表。这些可以由应用程序资源指定的导出列表修改,然后由应用程序部署者修改,然后由用户修改。

自版本:
1.3
  • Field Details

  • Method Details

    • lookup

      Object lookup(Name name) throws NamingException
      检索命名对象。如果name为空,则返回此上下文的新实例(表示与此上下文相同的命名上下文,但其环境可以独立修改并且可以同时访问)。
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到name的对象
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • lookup

      Object lookup(String name) throws NamingException
      检索命名对象。有关详细信息,请参见lookup(Name)
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到name的对象
      抛出:
      NamingException - 如果遇到命名异常
    • bind

      void bind(Name name, Object obj) throws NamingException
      将名称绑定到对象。所有中间上下文和目标上下文(由名称的除了终端原子组件之外的所有部分命名的上下文)必须已经存在。
      参数:
      name - 要绑定的名称;不能为空
      obj - 要绑定的对象;可能为空
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果对象未提供所有必需属性
      NamingException - 如果遇到命名异常
      参见:
    • bind

      void bind(String name, Object obj) throws NamingException
      将名称绑定到对象。有关详细信息,请参见bind(Name, Object)
      参数:
      name - 要绑定的名称;不能为空
      obj - 要绑定的对象;可能为空
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果对象未提供所有必需的属性
      NamingException - 如果遇到命名异常
    • rebind

      void rebind(Name name, Object obj) throws NamingException
      将名称绑定到对象,覆盖任何现有绑定。所有中间上下文和目标上下文(由名称的除了终端原子组件之外的所有部分命名的上下文)必须已经存在。

      如果对象是一个DirContext,则与名称关联的任何现有属性将被替换为对象的属性。否则,与名称关联的任何现有属性保持不变。

      参数:
      name - 要绑定的名称;不能为空
      obj - 要绑定的对象;可能为空
      抛出:
      InvalidAttributesException - 如果对象未提供所有必需的属性
      NamingException - 如果遇到命名异常
      参见:
    • rebind

      void rebind(String name, Object obj) throws NamingException
      将名称绑定到对象,覆盖任何现有绑定。有关详细信息,请参见rebind(Name, Object)
      参数:
      name - 要绑定的名称;不能为空
      obj - 要绑定的对象;可能为空
      抛出:
      InvalidAttributesException - 如果对象未提供所有必需的属性
      NamingException - 如果遇到命名异常
    • unbind

      void unbind(Name name) throws NamingException
      解绑命名对象。从目标上下文中删除name中的终端原子名称。

      此方法是幂等的。即使终端原子名称未绑定到目标上下文,它也会成功,但如果任何中间上下文不存在,则会抛出NameNotFoundException

      与名称关联的任何属性都将被移除。中间上下文不会被更改。

      参数:
      name - 要解绑的名称;不能为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NamingException - 如果遇到命名异常
      参见:
    • unbind

      void unbind(String name) throws NamingException
      解绑命名对象。有关详细信息,请参见unbind(Name)
      参数:
      name - 要解绑的名称;不能为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NamingException - 如果遇到命名异常
    • rename

      void rename(Name oldName, Name newName) throws NamingException
      将新名称绑定到旧名称绑定的对象,并解绑旧名称。两个名称都是相对于此上下文的。与旧名称关联的任何属性将与新名称关联。旧名称的中间上下文不会更改。
      参数:
      oldName - 现有绑定的名称;不能为空
      newName - 新绑定的名称;不能为空
      抛出:
      NameAlreadyBoundException - 如果newName已经绑定
      NamingException - 如果遇到命名异常
      参见:
    • rename

      void rename(String oldName, String newName) throws NamingException
      将新名称绑定到旧名称绑定的对象,并解绑旧名称。有关详细信息,请参见rename(Name, Name)
      参数:
      oldName - 现有绑定的名称;不能为空
      newName - 新绑定的名称;不能为空
      抛出:
      NameAlreadyBoundException - 如果newName已经绑定
      NamingException - 如果遇到命名异常
    • list

      枚举命名上下文中绑定的名称,以及绑定到它们的对象的类名。不包括任何子上下文的内容。

      如果向此上下文添加或删除绑定,则先前返回的枚举的影响是未定义的。

      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的名称和类名的枚举。枚举的每个元素的类型为NameClassPair
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • list

      枚举命名上下文中绑定的名称,以及绑定到它们的对象的类名。有关详细信息,请参见list(Name)
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的名称和类名的枚举。枚举的每个元素的类型为NameClassPair
      抛出:
      NamingException - 如果遇到命名异常
    • listBindings

      NamingEnumeration<Binding> listBindings(Name name) throws NamingException
      枚举命名上下文中绑定的名称,以及绑定到它们的对象。不包括任何子上下文的内容。

      如果向此上下文添加或删除绑定,则先前返回的枚举的影响是未定义的。

      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的枚举。枚举的每个元素的类型为Binding
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • listBindings

      NamingEnumeration<Binding> listBindings(String name) throws NamingException
      枚举命名上下文中绑定的名称,以及绑定到它们的对象。有关详细信息,请参见listBindings(Name)
      参数:
      name - 要列出的上下文的名称
      返回:
      此上下文中绑定的枚举。枚举的每个元素的类型为Binding
      抛出:
      NamingException - 如果遇到命名异常
    • destroySubcontext

      void destroySubcontext(Name name) throws NamingException
      销毁命名上下文并将其从命名空间中移除。与名称关联的任何属性也将被移除。中间上下文不会被销毁。

      此方法是幂等的。即使终端原子名称未绑定到目标上下文,它也会成功,但如果任何中间上下文不存在,则会抛出NameNotFoundException

      在联合命名系统中,来自一个命名系统的上下文可能绑定到另一个名称。随后可以使用复合名称查找并对外部上下文执行操作。但是,尝试使用此复合名称销毁上下文将失败,并显示NotContextException,因为外部上下文不是绑定它的上下文的“子上下文”。相反,请使用unbind()来移除外部上下文的绑定。销毁外部上下文需要在外部上下文的“本机”命名系统上执行destroySubcontext()

      参数:
      name - 要销毁的上下文的名称;不能为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NotContextException - 如果名称已绑定但不是上下文,或者不是适当类型的上下文
      ContextNotEmptyException - 如果命名上下文不为空
      NamingException - 如果遇到命名异常
      参见:
    • destroySubcontext

      void destroySubcontext(String name) throws NamingException
      销毁指定的上下文并将其从命名空间中移除。有关详细信息,请参阅destroySubcontext(Name)
      参数:
      name - 要销毁的上下文的名称;不能为空
      抛出:
      NameNotFoundException - 如果中间上下文不存在
      NotContextException - 如果名称已绑定但不是上下文,或者不是适当类型的上下文
      ContextNotEmptyException - 如果命名上下文不为空
      NamingException - 如果遇到命名异常
    • createSubcontext

      Context createSubcontext(Name name) throws NamingException
      创建并绑定新的上下文。使用给定名称创建新的上下文,并将其绑定到目标上下文(由名称的除了终端原子组件的所有部分命名)。所有中间上下文和目标上下文必须已经存在。
      参数:
      name - 要创建的上下文的名称;不能为空
      返回:
      新创建的上下文
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果创建子上下文需要指定强制属性
      NamingException - 如果遇到命名异常
      参见:
    • createSubcontext

      Context createSubcontext(String name) throws NamingException
      创建并绑定新的上下文。有关详细信息,请参阅createSubcontext(Name)
      参数:
      name - 要创建的上下文的名称;不能为空
      返回:
      新创建的上下文
      抛出:
      NameAlreadyBoundException - 如果名称已经绑定
      InvalidAttributesException - 如果创建子上下文需要指定强制属性
      NamingException - 如果遇到命名异常
    • lookupLink

      Object lookupLink(Name name) throws NamingException
      检索指定名称的对象,遵循链接,但不包括名称的终端原子组件。如果绑定到name的对象不是链接,则返回对象本身。
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到name的对象,不包括终端链接(如果有)。
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • lookupLink

      Object lookupLink(String name) throws NamingException
      检索指定名称的对象,遵循链接,但不包括名称的终端原子组件。有关详细信息,请参阅lookupLink(Name)
      参数:
      name - 要查找的对象的名称
      返回:
      绑定到name的对象,不包括终端链接(如果有)
      抛出:
      NamingException - 如果遇到命名异常
    • getNameParser

      NameParser getNameParser(Name name) throws NamingException
      检索与指定上下文关联的解析器。在命名空间联合中,不同的命名系统将以不同方式解析名称。此方法允许应用程序获取解析器,使用特定命名系统的命名约定将名称解析为其原子组件。在任何单个命名系统中,此方法返回的NameParser对象必须相等(使用equals()测试)。
      参数:
      name - 要获取解析器的上下文的名称
      返回:
      可以将复合名称解析为其原子组件的名称解析器
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • getNameParser

      NameParser getNameParser(String name) throws NamingException
      检索与指定上下文关联的解析器。有关详细信息,请参阅getNameParser(Name)
      参数:
      name - 要获取解析器的上下文的名称
      返回:
      可以将复合名称解析为其原子组件的名称解析器
      抛出:
      NamingException - 如果遇到命名异常
    • composeName

      Name composeName(Name name, Name prefix) throws NamingException
      将此上下文的名称与相对于此上下文的名称组合。给定相对于此上下文的名称(name)和此上下文相对于其祖先之一的名称(prefix),此方法返回使用涉及的命名系统的语法组合两个名称的结果。也就是说,如果name命名相对于此上下文的对象,则结果是相同对象的名称,但相对于祖先上下文。任何名称都不能为null。

      例如,如果此上下文相对于初始上下文命名为"wiz.com",那么

        composeName("east", "wiz.com")  
      可能返回"east.wiz.com"。如果相反,此上下文命名为"org/research",那么
        composeName("user/jane", "org/research")        
      可能返回"org/research/user/jane",而
        composeName("user/jane", "research")    
      返回"research/user/jane"
      参数:
      name - 相对于此上下文的名称
      prefix - 此上下文相对于其祖先之一的名称
      返回:
      prefixname的组合
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • composeName

      String composeName(String name, String prefix) throws NamingException
      将此上下文的名称与相对于此上下文的名称组合。有关详细信息,请参阅composeName(Name, Name)
      参数:
      name - 相对于此上下文的名称
      prefix - 此上下文相对于其祖先之一的名称
      返回:
      prefixname的组合
      抛出:
      NamingException - 如果遇到命名异常
    • addToEnvironment

      Object addToEnvironment(String propName, Object propVal) throws NamingException
      向此上下文的环境中添加新的环境属性。如果属性已经存在,则其值将被覆盖。有关环境属性的更多详细信息,请参阅类描述。
      参数:
      propName - 要添加的环境属性的名称;不能为空
      propVal - 要添加的属性的值;不能为空
      返回:
      属性的先前值,如果属性之前不在环境中则为null
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • removeFromEnvironment

      Object removeFromEnvironment(String propName) throws NamingException
      从此上下文的环境中删除环境属性。有关环境属性的更多详细信息,请参阅类描述。
      参数:
      propName - 要删除的环境属性的名称;不能为空
      返回:
      属性的先前值,如果属性不在环境中则为null
      抛出:
      NamingException - 如果遇到命名异常
      参见:
    • getEnvironment

      Hashtable<?,?> getEnvironment() throws NamingException
      检索此上下文中生效的环境。有关环境属性的更多详细信息,请参阅类描述。

      调用者不应对返回的对象进行任何更改:对上下文的影响是未定义的。可以使用addToEnvironment()removeFromEnvironment()更改此上下文的环境。

      返回:
      此上下文的环境;永不为null
      抛出:
      NamingException - 如果遇到命名异常
      另请参见:
    • close

      void close() throws NamingException
      关闭此上下文。此方法立即释放此上下文的资源,而不是等待垃圾回收器自动释放它们。

      此方法是幂等的:在已关闭的上下文上调用它不会产生任何效果。不允许在已关闭的上下文上调用任何其他方法,并导致未定义的行为。

      抛出:
      NamingException - 如果遇到命名异常
    • getNameInNamespace

      String getNameInNamespace() throws NamingException
      检索此上下文在其自己命名空间中的完整名称。

      许多命名服务对其各自命名空间中的对象有一个“完整名称”的概念。例如,LDAP条目具有一个专有名称,DNS记录具有一个完全限定名称。此方法允许客户端应用程序检索此名称。此方法返回的字符串不是JNDI复合名称,不应直接传递给上下文方法。对于没有完整名称概念的命名系统,将抛出OperationNotSupportedException

      返回:
      此上下文在其自己命名空间中的名称;永不为null
      抛出:
      OperationNotSupportedException - 如果命名系统没有完整名称的概念
      NamingException - 如果遇到命名异常
      自1.3起
      1.3