LDIF 解析

LDAP 目录交换格式 (LDIF) 文件是用于以平面文件格式描述目录数据的标准媒介。这种格式最常见的用途包括信息传输和存档。但是,该标准还定义了一种以平面文件格式描述对存储数据的修改的方法。这种后一种类型的 LDIF 通常被称为changetypemodify LDIF。

org.springframework.ldap.ldif 包提供了解析 LDIF 文件并将它们反序列化为有形的对象的类。LdifParserorg.springframework.ldap.ldif 包的主要类,能够解析符合 RFC 2849 的文件。此类从资源读取行并将它们组装成一个 LdapAttributes 对象。

LdifParser 目前忽略changetype LDIF 条目,因为它们在应用程序环境中的实用性尚未确定。

对象表示

org.springframework.ldap.core 包中的两个类提供了在代码中表示 LDIF 的方法

  • LdapAttribute:扩展 javax.naming.directory.BasicAttribute,添加对 RFC2849 中定义的 LDIF 选项的支持。

  • LdapAttributes:扩展 javax.naming.directory.BasicAttributes,添加对 DN 的专门支持。

LdapAttribute 对象将选项表示为 Set<String>LdapAttributes 对象中添加的 DN 支持使用 javax.naming.ldap.LdapName 类。

解析器

Parser 接口为操作提供基础,并使用三个支持的策略定义

  • SeparatorPolicy:建立将行组装成属性的机制。

  • AttributeValidationPolicy:确保属性在解析之前结构正确。

  • Specification:提供一种机制,可以在组装后验证对象结构。

这些接口的默认实现如下

  • org.springframework.ldap.ldif.parser.LdifParser

  • org.springframework.ldap.ldif.support.SeparatorPolicy

  • org.springframework.ldap.ldif.support.DefaultAttributeValidationPolicy

  • org.springframework.ldap.schema.DefaultSchemaSpecification

这四个类共同解析资源文件逐行,并将数据转换为 LdapAttributes 对象。

SeparatorPolicy 确定如何解释从源文件读取的各个行,因为 LDIF 规范允许属性跨越多行。默认策略在读取行的顺序上下文中评估行,以确定正在考虑的行类型。控制 属性和 changetype 记录将被忽略。

DefaultAttributeValidationPolicy 使用 REGEX 表达式来确保每个属性在解析后都符合有效的属性格式(根据 RFC 2849)。如果属性验证失败,则会记录 InvalidAttributeFormatException,并且记录将被跳过(解析器返回 null)。

模式验证

通过 org.springframework.ldap.schema 包中的 Specification 接口,可以提供一种机制来根据模式验证解析后的对象。DefaultSchemaSpecification 不执行任何验证,可用于已知记录有效且无需检查的实例。此选项节省了验证带来的性能损失。BasicSchemaSpecification 应用基本检查,例如确保已提供 DN 和对象类声明。目前,针对实际模式的验证需要实现 Specification 接口。

Spring Batch 集成

虽然 LdifParser 可以被任何需要解析 LDIF 文件的应用程序使用,但 Spring 提供了一个批处理框架,该框架提供了许多文件处理实用程序来解析分隔文件,例如 CSV。org.springframework.ldap.ldif.batch 包提供了在 Spring Batch 框架中使用 LdifParser 作为有效配置选项所需的类。此包中有五个类。它们共同提供了三种基本用例

  • 从文件读取 LDIF 记录并返回 LdapAttributes 对象。

  • 从文件读取 LDIF 记录并将记录映射到 Java 对象(POJO)。

  • 将 LDIF 记录写入文件。

第一个用例是通过LdifReader实现的。此类扩展了 Spring Batch 的AbstractItemCountingItemStreamItemReader并实现了它的ResourceAwareItemReaderItemStream。它自然地融入框架,您可以使用它从文件中读取LdapAttributes对象。

您可以使用MappingLdifReader将 LDIF 对象直接映射到任何 POJO。此类要求您提供RecordMapper接口的实现。此实现应实现将对象映射到 POJO 的逻辑。

您可以实现RecordCallbackHandler并将实现提供给任一读取器。您可以使用此处理程序来操作跳过的记录。有关更多信息,请参阅Spring Batch API 文档

此包的最后一个成员LdifAggregator可用于将 LDIF 记录写入文件。此类调用LdapAttributes对象的toString()方法。